]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
RDS: avoid duplicate connection drop for self loopback
authorSantosh Shilimkar <santosh.shilimkar@oracle.com>
Sat, 17 Sep 2016 02:20:53 +0000 (19:20 -0700)
committerSantosh Shilimkar <santosh.shilimkar@oracle.com>
Wed, 12 Oct 2016 17:20:26 +0000 (10:20 -0700)
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 <michael.nowak@oracle.com>
Tested-by: Rafael Alejandro Peralez <rafael.peralez@oracle.com>
Tested-by: Liwen Huang <liwen.huang@oracle.com>
Tested-by: Hong Liu <hong.x.liu@oracle.com>
Reviewed-by: Mukesh Kacker <mukesh.kacker@oracle.com>
Signed-off-by: Santosh Shilimkar <santosh.shilimkar@oracle.com>
net/rds/rdma_transport.c
net/rds/rds.h

index d37a240353b1f94594989c6ff0827383aa522169..078b99bdf2d269f1befe02315b59a4cccab57582 100644 (file)
@@ -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;
 
index 5f73d6ac359f545173ff6b45267d2ebaab76783e..8645c10cf4dea5abcd203b1d632e690bf0f8b4dd 100644 (file)
@@ -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);