From: Håkon Bugge Date: Thu, 7 Mar 2019 11:36:44 +0000 (+0100) Subject: rds: ib: Flush ARP cache when needed X-Git-Tag: v4.1.12-124.31.3~112 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=98954c41cdd34113e91ae20b3d916d75100236c6;p=users%2Fjedix%2Flinux-maple.git rds: ib: Flush ARP cache when needed 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 Signed-off-by: Håkon Bugge Tested-by: Rosa Lopez Reviewed-by: Dag Moxnes Signed-off-by: Brian Maly --- diff --git a/net/rds/rdma_transport.c b/net/rds/rdma_transport.c index 3a02ba9f099b..259e9ece958d 100644 --- a/net/rds/rdma_transport.c +++ b/net/rds/rdma_transport.c @@ -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);