]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
net/rds: WARNING: at net/rds/recv.c:222 rds_recv_hs_exthdrs+0xf8/0x1e0
authorVenkat Venkatsubra <venkat.x.venkatsubra@oracle.com>
Fri, 18 Jan 2019 16:25:21 +0000 (08:25 -0800)
committerBrian Maly <brian.maly@oracle.com>
Wed, 30 Jan 2019 04:07:10 +0000 (23:07 -0500)
The stack trace looks as follows:

WARNING: at net/rds/recv.c:222 rds_recv_hs_exthdrs+0xf8/0x1e0 [rds]()
Call Trace:
dump_stack+0x63/0x81
warn_slowpath_common+0x8a/0xc0
warn_slowpath_null+0x1a/0x20
rds_recv_hs_exthdrs+0xf8/0x1e0 [rds]
rds_recv_local.isra.7+0x396/0x440 [rds]
rds_recv_incoming+0x2d8/0x3c0 [rds]
rds_ib_recv_cqe_handler+0x44f/0x6d0 [rds_rdma]
poll_rcq+0x7a/0xa0 [rds_rdma]
rds_ib_rx+0xa4/0x220 [rds_rdma]
rds_ib_tasklet_fn_recv+0x30/0x40 [rds_rdma]
...

commit 041dc3e4d3
("Backport multipath RDS from upstream to UEK4") treats an
incoming rds ping or rds pong differently if the local (in case of pong) or
sender's port (in case of ping) is 1 (RDS_FLAG_PROBE_PORT).

There is nothing stopping rds-ping from picking this port for it's local side
since it does wildcard socket bind.

The fix is to check for t_mp_capable transport.

Orabug: 29201779

Reviewed-by: Haakon Bugge <haakon.bugge@oracle.com>
Reviewed-by: Rama Nichanamatlu <rama.nichanamatlu@oracle.com>
Signed-off-by: Venkat Venkatsubra <venkat.x.venkatsubra@oracle.com>
Signed-off-by: Brian Maly <brian.maly@oracle.com>
net/rds/recv.c

index 52e0936eb5e35793e3cebd34f125162f8be30950..4c5ad749db4b08dc66055e21255a42950ba7f550 100644 (file)
@@ -678,7 +678,8 @@ rds_recv_local(struct rds_conn_path *cp, struct in6_addr *saddr,
                        /* if this is a handshake ping,
                         * start multipath if necessary
                         */
-                       if (RDS_HS_PROBE(be16_to_cpu(inc->i_hdr.h_sport),
+                       if (conn->c_trans->t_mp_capable &&
+                           RDS_HS_PROBE(be16_to_cpu(inc->i_hdr.h_sport),
                                         be16_to_cpu(inc->i_hdr.h_dport))) {
                                rds_recv_hs_exthdrs(&inc->i_hdr, cp->cp_conn);
                                rds_start_mprds(cp->cp_conn);
@@ -686,7 +687,8 @@ rds_recv_local(struct rds_conn_path *cp, struct in6_addr *saddr,
                }
                goto out;
        }
-       if (be16_to_cpu(inc->i_hdr.h_dport) ==  RDS_FLAG_PROBE_PORT &&
+       if (conn->c_trans->t_mp_capable &&
+           be16_to_cpu(inc->i_hdr.h_dport) ==  RDS_FLAG_PROBE_PORT &&
            inc->i_hdr.h_sport == 0) {
                rds_recv_hs_exthdrs(&inc->i_hdr, cp->cp_conn);
                /* if this is a handshake pong, start multipath if necessary */