]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
ice: Respond to a NETDEV_UNREGISTER event for LAG
authorDave Ertman <david.m.ertman@intel.com>
Thu, 7 Oct 2021 15:40:31 +0000 (08:40 -0700)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Mon, 25 Oct 2021 20:44:37 +0000 (13:44 -0700)
When the PF is a member of a link aggregate, and the driver
is removed, the process will hang unless we respond to the
NETDEV_UNREGISTER event that is sent to the event_handler
for LAG.

Add a case statement for the ice_lag_event_handler to unlink
the PF from the link aggregate.

Also remove code that was incorrectly applying a dev_hold to
peer_netdevs that were associated with the ice driver.

Fixes: df006dd4b1dc ("ice: Add initial support framework for LAG")
Signed-off-by: Dave Ertman <david.m.ertman@intel.com>
Tested-by: Tony Brelinski <tony.brelinski@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/ice/ice_lag.c

index 37c18c66b5c72c49e9dce3fb73199422b478bd07..e375ac849aecd6ef5dfd06c1ae821d12c635e2d1 100644 (file)
@@ -100,9 +100,9 @@ static void ice_display_lag_info(struct ice_lag *lag)
  */
 static void ice_lag_info_event(struct ice_lag *lag, void *ptr)
 {
-       struct net_device *event_netdev, *netdev_tmp;
        struct netdev_notifier_bonding_info *info;
        struct netdev_bonding_info *bonding_info;
+       struct net_device *event_netdev;
        const char *lag_netdev_name;
 
        event_netdev = netdev_notifier_info_to_dev(ptr);
@@ -123,19 +123,6 @@ static void ice_lag_info_event(struct ice_lag *lag, void *ptr)
                goto lag_out;
        }
 
-       rcu_read_lock();
-       for_each_netdev_in_bond_rcu(lag->upper_netdev, netdev_tmp) {
-               if (!netif_is_ice(netdev_tmp))
-                       continue;
-
-               if (netdev_tmp && netdev_tmp != lag->netdev &&
-                   lag->peer_netdev != netdev_tmp) {
-                       dev_hold(netdev_tmp);
-                       lag->peer_netdev = netdev_tmp;
-               }
-       }
-       rcu_read_unlock();
-
        if (bonding_info->slave.state)
                ice_lag_set_backup(lag);
        else
@@ -319,6 +306,9 @@ ice_lag_event_handler(struct notifier_block *notif_blk, unsigned long event,
        case NETDEV_BONDING_INFO:
                ice_lag_info_event(lag, ptr);
                break;
+       case NETDEV_UNREGISTER:
+               ice_lag_unlink(lag, ptr);
+               break;
        default:
                break;
        }