ice: Respond to a NETDEV_UNREGISTER event for LAG
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>
This commit is contained in:
parent
f7a1e76d0f
commit
6a8b357278
@ -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)
|
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_notifier_bonding_info *info;
|
||||||
struct netdev_bonding_info *bonding_info;
|
struct netdev_bonding_info *bonding_info;
|
||||||
|
struct net_device *event_netdev;
|
||||||
const char *lag_netdev_name;
|
const char *lag_netdev_name;
|
||||||
|
|
||||||
event_netdev = netdev_notifier_info_to_dev(ptr);
|
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;
|
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)
|
if (bonding_info->slave.state)
|
||||||
ice_lag_set_backup(lag);
|
ice_lag_set_backup(lag);
|
||||||
else
|
else
|
||||||
@ -319,6 +306,9 @@ ice_lag_event_handler(struct notifier_block *notif_blk, unsigned long event,
|
|||||||
case NETDEV_BONDING_INFO:
|
case NETDEV_BONDING_INFO:
|
||||||
ice_lag_info_event(lag, ptr);
|
ice_lag_info_event(lag, ptr);
|
||||||
break;
|
break;
|
||||||
|
case NETDEV_UNREGISTER:
|
||||||
|
ice_lag_unlink(lag, ptr);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user