We need to notify peers only when failover and migration happen. It is unnecessary to call that in other events like FATAL, NON_FATAL, CHANGE_PARAM, and TIMEOUT resets since in those scenarios the MAC address and ip address mapping does not change. Originally all the resets except CHANGE_PARAM are processed by do_reset such that we need to find out failover and migration cases in do_reset and call notifier functions. We only need to notify peers in do_reset and do_hard_reset. We don't need notify peers in do_change_param_reset since it is a CHANGE_PARAM reset. In a nested reset case, it will finally call into do_hard_reset with reasons other than failvoer and migration. So, we don't need to check the reset reason in do_hard_reset and just call notifier functions anyway.
netdev_notify_peers calls below two functions with rtnl lock(). call_netdevice_notifiers(NETDEV_NOTIFY_PEERS, dev); call_netdevice_notifiers(NETDEV_RESEND_IGMP, dev); When netdev_notify_peers was substituted in commit 986103e7920c ("net/ibmvnic: Fix RTNL deadlock during device reset"), call_netdevice_notifiers(NETDEV_RESEND_IGMP, dev) was missed. Fixes: 61d3e1d9bc2a ("ibmvnic: Remove netdev notify for failover resets") Fixes: 986103e7920c ("net/ibmvnic: Fix RTNL deadlock during device reset") Suggested-by: Brian King <brk...@linux.vnet.ibm.com> Suggested-by: Pradeep Satyanarayana <prade...@linux.vnet.ibm.com> Signed-off-by: Dany Madden <d...@linux.ibm.com> Signed-off-by: Lijun Pan <l...@linux.ibm.com> --- drivers/net/ethernet/ibm/ibmvnic.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c index 1b702a43a5d0..718da39f5ae4 100644 --- a/drivers/net/ethernet/ibm/ibmvnic.c +++ b/drivers/net/ethernet/ibm/ibmvnic.c @@ -2067,8 +2067,11 @@ static int do_reset(struct ibmvnic_adapter *adapter, for (i = 0; i < adapter->req_rx_queues; i++) napi_schedule(&adapter->napi[i]); - if (adapter->reset_reason != VNIC_RESET_FAILOVER) + if (adapter->reset_reason == VNIC_RESET_FAILOVER || + adapter->reset_reason == VNIC_RESET_MOBILITY) { call_netdevice_notifiers(NETDEV_NOTIFY_PEERS, netdev); + call_netdevice_notifiers(NETDEV_RESEND_IGMP, netdev); + } rc = 0; @@ -2138,6 +2141,9 @@ static int do_hard_reset(struct ibmvnic_adapter *adapter, if (rc) return IBMVNIC_OPEN_FAILED; + call_netdevice_notifiers(NETDEV_NOTIFY_PEERS, netdev); + call_netdevice_notifiers(NETDEV_RESEND_IGMP, netdev); + return 0; } -- 2.23.0