Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2be0f264 authored by stephen hemminger's avatar stephen hemminger Committed by David S. Miller
Browse files

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: default avatarStephen Hemminger <sthemmin@microsoft.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 5900eca1
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -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);