hyperv: Fix race between probe and open calls
Moving the register_netdev to the end of probe to prevent possible open call happens before NetVSP is connected. Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com> Reviewed-by: K. Y. Srinivasan <kys@microsoft.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
965cdea825
commit
a68f961461
1 changed files with 8 additions and 12 deletions
|
@ -261,9 +261,7 @@ int netvsc_recv_callback(struct hv_device *device_obj,
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
|
|
||||||
net = ((struct netvsc_device *)hv_get_drvdata(device_obj))->ndev;
|
net = ((struct netvsc_device *)hv_get_drvdata(device_obj))->ndev;
|
||||||
if (!net) {
|
if (!net || net->reg_state != NETREG_REGISTERED) {
|
||||||
netdev_err(net, "got receive callback but net device"
|
|
||||||
" not initialized yet\n");
|
|
||||||
packet->status = NVSP_STAT_FAIL;
|
packet->status = NVSP_STAT_FAIL;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -435,19 +433,11 @@ static int netvsc_probe(struct hv_device *dev,
|
||||||
SET_ETHTOOL_OPS(net, ðtool_ops);
|
SET_ETHTOOL_OPS(net, ðtool_ops);
|
||||||
SET_NETDEV_DEV(net, &dev->device);
|
SET_NETDEV_DEV(net, &dev->device);
|
||||||
|
|
||||||
ret = register_netdev(net);
|
|
||||||
if (ret != 0) {
|
|
||||||
pr_err("Unable to register netdev.\n");
|
|
||||||
free_netdev(net);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Notify the netvsc driver of the new device */
|
/* Notify the netvsc driver of the new device */
|
||||||
device_info.ring_size = ring_size;
|
device_info.ring_size = ring_size;
|
||||||
ret = rndis_filter_device_add(dev, &device_info);
|
ret = rndis_filter_device_add(dev, &device_info);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
netdev_err(net, "unable to add netvsc device (ret %d)\n", ret);
|
netdev_err(net, "unable to add netvsc device (ret %d)\n", ret);
|
||||||
unregister_netdev(net);
|
|
||||||
free_netdev(net);
|
free_netdev(net);
|
||||||
hv_set_drvdata(dev, NULL);
|
hv_set_drvdata(dev, NULL);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -456,7 +446,13 @@ static int netvsc_probe(struct hv_device *dev,
|
||||||
|
|
||||||
netif_carrier_on(net);
|
netif_carrier_on(net);
|
||||||
|
|
||||||
out:
|
ret = register_netdev(net);
|
||||||
|
if (ret != 0) {
|
||||||
|
pr_err("Unable to register netdev.\n");
|
||||||
|
rndis_filter_device_remove(dev);
|
||||||
|
free_netdev(net);
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue