From 61dce74df53c496791ef42c88daa4c756be9bafe Mon Sep 17 00:00:00 2001 From: Santosh Shilimkar Date: Fri, 16 Sep 2016 19:20:53 -0700 Subject: [PATCH] RDS: avoid duplicate connection drop for self loopback For self-IB loopback is special mode and the c_passive conn is just a place holder to stick the the second QP. Orabug: 22347191 Tested-by: Michael Nowak Tested-by: Rafael Alejandro Peralez Tested-by: Liwen Huang Tested-by: Hong Liu Reviewed-by: Mukesh Kacker Signed-off-by: Santosh Shilimkar --- net/rds/rdma_transport.c | 3 ++- net/rds/rds.h | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/net/rds/rdma_transport.c b/net/rds/rdma_transport.c index d37a240353b1..078b99bdf2d2 100644 --- a/net/rds/rdma_transport.c +++ b/net/rds/rdma_transport.c @@ -309,7 +309,8 @@ int rds_rdma_cm_event_handler(struct rdma_cm_id *cm_id, "ADDR_CHANGE: calling rds_conn_drop <%u.%u.%u.%u,%u.%u.%u.%u,%d>\n", NIPQUAD(conn->c_laddr), NIPQUAD(conn->c_faddr), conn->c_tos); - rds_conn_drop(conn, DR_IB_ADDR_CHANGE); + if (!rds_conn_self_loopback_passive(conn)) + rds_conn_drop(conn, DR_IB_ADDR_CHANGE); } break; diff --git a/net/rds/rds.h b/net/rds/rds.h index 5f73d6ac359f..8645c10cf4de 100644 --- a/net/rds/rds.h +++ b/net/rds/rds.h @@ -887,6 +887,15 @@ rds_conn_connecting(struct rds_connection *conn) return atomic_read(&conn->c_state) == RDS_CONN_CONNECTING; } +static inline bool +rds_conn_self_loopback_passive(struct rds_connection *conn) +{ + if (conn->c_laddr == conn->c_faddr && !conn->c_passive) + return true; + else + return false; +} + /* message.c */ struct rds_message *rds_message_alloc(unsigned int nents, gfp_t gfp); struct scatterlist *rds_message_alloc_sgs(struct rds_message *rm, int nents); -- 2.50.1