From: Santosh Shilimkar Date: Sat, 17 Sep 2016 02:20:53 +0000 (-0700) Subject: RDS: avoid duplicate connection drop for self loopback X-Git-Tag: v4.1.12-92~67^2~4 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=61dce74df53c496791ef42c88daa4c756be9bafe;p=users%2Fjedix%2Flinux-maple.git 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 --- 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);