diff options
author | stephen hemminger <stephen@networkplumber.org> | 2017-05-03 16:59:21 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-05-04 11:08:36 -0400 |
commit | 2be0f2644598ee4b8ea0ed6a32913e1ce0212c9c (patch) | |
tree | d1fa6ad2f24c3840c1c6780254bbc95d3a01bdd9 | |
parent | 5900eca1ac3bcb03cd0da1c9a5504f1fbfe9b5bc (diff) | |
download | op-kernel-dev-2be0f2644598ee4b8ea0ed6a32913e1ce0212c9c.zip op-kernel-dev-2be0f2644598ee4b8ea0ed6a32913e1ce0212c9c.tar.gz |
netvsc: make sure napi enabled before vmbus_open
This fixes a race where vmbus callback for new packet arriving
could occur before NAPI is initialized.
Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/hyperv/netvsc.c | 8 | ||||
-rw-r--r-- | drivers/net/hyperv/rndis_filter.c | 2 |
2 files changed, 6 insertions, 4 deletions
diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c index 15749d3..652453d 100644 --- a/drivers/net/hyperv/netvsc.c +++ b/drivers/net/hyperv/netvsc.c @@ -1322,6 +1322,10 @@ int netvsc_device_add(struct hv_device *device, nvchan->channel = device->channel; } + /* Enable NAPI handler before init callbacks */ + netif_napi_add(ndev, &net_device->chan_table[0].napi, + netvsc_poll, NAPI_POLL_WEIGHT); + /* Open the channel */ ret = vmbus_open(device->channel, ring_size * PAGE_SIZE, ring_size * PAGE_SIZE, NULL, 0, @@ -1329,6 +1333,7 @@ int netvsc_device_add(struct hv_device *device, net_device->chan_table); if (ret != 0) { + netif_napi_del(&net_device->chan_table[0].napi); netdev_err(ndev, "unable to open channel: %d\n", ret); goto cleanup; } @@ -1336,9 +1341,6 @@ int netvsc_device_add(struct hv_device *device, /* Channel is opened */ netdev_dbg(ndev, "hv_netvsc channel opened successfully\n"); - /* Enable NAPI handler for init callbacks */ - netif_napi_add(ndev, &net_device->chan_table[0].napi, - netvsc_poll, NAPI_POLL_WEIGHT); napi_enable(&net_device->chan_table[0].napi); /* Writing nvdev pointer unlocks netvsc_send(), make sure chn_table is diff --git a/drivers/net/hyperv/rndis_filter.c b/drivers/net/hyperv/rndis_filter.c index ab92c3c..f9d5b0b 100644 --- a/drivers/net/hyperv/rndis_filter.c +++ b/drivers/net/hyperv/rndis_filter.c @@ -1018,7 +1018,7 @@ static void netvsc_sc_open(struct vmbus_channel *new_sc) if (ret == 0) napi_enable(&nvchan->napi); else - netdev_err(ndev, "sub channel open failed (%d)\n", ret); + netif_napi_del(&nvchan->napi); if (refcount_dec_and_test(&nvscdev->sc_offered)) complete(&nvscdev->channel_init_wait); |