Skip to content

Commit

Permalink
hv_netvsc: Switch the data path at the right time during hibernation
Browse files Browse the repository at this point in the history
When netvsc_resume() is called, the mlx5 VF NIC has not been resumed yet,
so in the future the host might sliently fail the call netvsc_vf_changed()
-> netvsc_switch_datapath() there, even if the call works now.

Call netvsc_vf_changed() in the NETDEV_CHANGE event handler: at that time
the mlx5 VF NIC has been resumed.

Fixes: 19162fd ("hv_netvsc: Fix hibernation for mlx5 VF driver")
Signed-off-by: Dexuan Cui <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
dcui authored and davem330 committed Sep 10, 2020
1 parent 2fb541c commit de214e5
Showing 1 changed file with 1 addition and 10 deletions.
11 changes: 1 addition & 10 deletions drivers/net/hyperv/netvsc_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -2619,7 +2619,6 @@ static int netvsc_resume(struct hv_device *dev)
struct net_device *net = hv_get_drvdata(dev);
struct net_device_context *net_device_ctx;
struct netvsc_device_info *device_info;
struct net_device *vf_netdev;
int ret;

rtnl_lock();
Expand All @@ -2632,15 +2631,6 @@ static int netvsc_resume(struct hv_device *dev)
netvsc_devinfo_put(device_info);
net_device_ctx->saved_netvsc_dev_info = NULL;

/* A NIC driver (e.g. mlx5) may keep the VF network interface across
* hibernation, but here the data path is implicitly switched to the
* netvsc NIC since the vmbus channel is closed and re-opened, so
* netvsc_vf_changed() must be used to switch the data path to the VF.
*/
vf_netdev = rtnl_dereference(net_device_ctx->vf_netdev);
if (vf_netdev && netvsc_vf_changed(vf_netdev) != NOTIFY_OK)
ret = -EINVAL;

rtnl_unlock();

return ret;
Expand Down Expand Up @@ -2701,6 +2691,7 @@ static int netvsc_netdev_event(struct notifier_block *this,
return netvsc_unregister_vf(event_dev);
case NETDEV_UP:
case NETDEV_DOWN:
case NETDEV_CHANGE:
return netvsc_vf_changed(event_dev);
default:
return NOTIFY_DONE;
Expand Down

0 comments on commit de214e5

Please sign in to comment.