]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
rds: ib: Flush ARP cache when needed
authorHåkon Bugge <haakon.bugge@oracle.com>
Thu, 7 Mar 2019 11:36:44 +0000 (12:36 +0100)
committerBrian Maly <brian.maly@oracle.com>
Tue, 21 May 2019 22:00:51 +0000 (18:00 -0400)
During Active/Active fail-over and fail-back, the ARP cache may
contain stale entries. Hence flush the foreign address from the ARP
cache when the following events are received:

   * address change
   * address error
   * unreachable
   * disconnect

Orabug: 29391909

Suggested-by: Ka-Cheong Poon <ka-cheong.poon@oracle.com>
Signed-off-by: Håkon Bugge <haakon.bugge@oracle.com>
Tested-by: Rosa Lopez <rosa.lopez@oracle.com>
Reviewed-by: Dag Moxnes <dag.moxnes@oracle.com>
Signed-off-by: Brian Maly <brian.maly@oracle.com>
net/rds/rdma_transport.c

index 3a02ba9f099b70787e90db1724a118e6e5c6af66..259e9ece958dcd10e208398c418dec49eb37e82d 100644 (file)
@@ -126,6 +126,12 @@ int rds_rdma_cm_event_handler_cmn(struct rdma_cm_id *cm_id,
                        rds_rtd(RDS_RTD_CM, "Bailing, conn %p being shut down, ret: %d\n",
                                conn, ret);
                        conn->c_reconnect_racing = 1;
+                       if (event->event == RDMA_CM_EVENT_ADDR_CHANGE ||
+                           event->event == RDMA_CM_EVENT_DISCONNECTED)
+                               /* These events might indicate the IP being moved,
+                                * hence flush the address
+                                */
+                               rds_ib_flush_arp_entry(&conn->c_faddr);
                        goto out;
                }
        }
@@ -225,6 +231,8 @@ int rds_rdma_cm_event_handler_cmn(struct rdma_cm_id *cm_id,
 
        case RDMA_CM_EVENT_ADDR_ERROR:
                if (conn) {
+                       /* IP might have been moved so flush the ARP entry and retry */
+                       rds_ib_flush_arp_entry(&conn->c_faddr);
                        rds_rtd_ptr(RDS_RTD_ERR,
                                    "ADDR_ERROR: conn %p, calling rds_conn_drop <%pI6c,%pI6c,%d>\n",
                                    conn, &conn->c_laddr,
@@ -238,6 +246,8 @@ int rds_rdma_cm_event_handler_cmn(struct rdma_cm_id *cm_id,
        case RDMA_CM_EVENT_UNREACHABLE:
        case RDMA_CM_EVENT_DEVICE_REMOVAL:
                if (conn) {
+                       /* IP might have been moved so flush the ARP entry and retry */
+                       rds_ib_flush_arp_entry(&conn->c_faddr);
                        rds_rtd_ptr(RDS_RTD_ERR,
                                    "CONN/UNREACHABLE/RMVAL ERR: conn %p, calling rds_conn_drop <%pI6c,%pI6c,%d>\n",
                                    conn, &conn->c_laddr,
@@ -294,6 +304,8 @@ int rds_rdma_cm_event_handler_cmn(struct rdma_cm_id *cm_id,
                break;
 
        case RDMA_CM_EVENT_ADDR_CHANGE:
+               /* IP might have been moved so flush the ARP entry and retry */
+               rds_ib_flush_arp_entry(&conn->c_faddr);
                rds_rtd_ptr(RDS_RTD_CM_EXT,
                            "ADDR_CHANGE event <%pI6c,%pI6c>\n",
                            &conn->c_laddr,
@@ -311,6 +323,8 @@ int rds_rdma_cm_event_handler_cmn(struct rdma_cm_id *cm_id,
                break;
 
        case RDMA_CM_EVENT_DISCONNECTED:
+               /* IP might have been moved so flush the ARP entry and retry */
+               rds_ib_flush_arp_entry(&conn->c_faddr);
                rds_rtd_ptr(RDS_RTD_CM,
                            "DISCONNECT event - dropping conn %p <%pI6c,%pI6c,%d>\n",
                            conn, &conn->c_laddr, &conn->c_faddr, conn->c_tos);