From 3cad84cd410783464a86a61f0b5bd2bc57340c9a Mon Sep 17 00:00:00 2001 From: Venkat Venkatsubra Date: Fri, 18 Jan 2019 08:25:21 -0800 Subject: [PATCH] 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 --- net/rds/recv.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/net/rds/recv.c b/net/rds/recv.c index 52e0936eb5e35..4c5ad749db4b0 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 */ -- 2.50.1