From: Venkat Venkatsubra Date: Fri, 18 Jan 2019 16:25:21 +0000 (-0800) Subject: net/rds: WARNING: at net/rds/recv.c:222 rds_recv_hs_exthdrs+0xf8/0x1e0 X-Git-Tag: v4.1.12-124.31.3~306 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=3cad84cd410783464a86a61f0b5bd2bc57340c9a;p=users%2Fjedix%2Flinux-maple.git net/rds: WARNING: at net/rds/recv.c:222 rds_recv_hs_exthdrs+0xf8/0x1e0 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 Reviewed-by: Rama Nichanamatlu Signed-off-by: Venkat Venkatsubra Signed-off-by: Brian Maly --- diff --git a/net/rds/recv.c b/net/rds/recv.c index 52e0936eb5e3..4c5ad749db4b 100644 --- a/net/rds/recv.c +++ b/net/rds/recv.c @@ -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 */