diff options
Diffstat (limited to 'drivers/net/hyperv/netvsc_drv.c')
| -rw-r--r-- | drivers/net/hyperv/netvsc_drv.c | 30 | 
1 files changed, 30 insertions, 0 deletions
| diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c index 153b97f8ec0d..23180f7b67b6 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c @@ -2798,6 +2798,31 @@ static struct  hv_driver netvsc_drv = {  	},  }; +/* Set VF's namespace same as the synthetic NIC */ +static void netvsc_event_set_vf_ns(struct net_device *ndev) +{ +	struct net_device_context *ndev_ctx = netdev_priv(ndev); +	struct net_device *vf_netdev; +	int ret; + +	vf_netdev = rtnl_dereference(ndev_ctx->vf_netdev); +	if (!vf_netdev) +		return; + +	if (!net_eq(dev_net(ndev), dev_net(vf_netdev))) { +		ret = dev_change_net_namespace(vf_netdev, dev_net(ndev), +					       "eth%d"); +		if (ret) +			netdev_err(vf_netdev, +				   "Cannot move to same namespace as %s: %d\n", +				   ndev->name, ret); +		else +			netdev_info(vf_netdev, +				    "Moved VF to namespace with: %s\n", +				    ndev->name); +	} +} +  /*   * On Hyper-V, every VF interface is matched with a corresponding   * synthetic interface. The synthetic interface is presented first @@ -2810,6 +2835,11 @@ static int netvsc_netdev_event(struct notifier_block *this,  	struct net_device *event_dev = netdev_notifier_info_to_dev(ptr);  	int ret = 0; +	if (event_dev->netdev_ops == &device_ops && event == NETDEV_REGISTER) { +		netvsc_event_set_vf_ns(event_dev); +		return NOTIFY_DONE; +	} +  	ret = check_dev_is_matching_vf(event_dev);  	if (ret != 0)  		return NOTIFY_DONE; | 
