Skip to content

Commit

Permalink
netvsc: Initialize all channel related state prior to opening the cha…
Browse files Browse the repository at this point in the history
…nnel

Prior to opening the channel we should have all the state setup to handle
interrupts. The current code does not do that; fix the bug. This bug
can result in faults in the interrupt path.

Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
K. Y. Srinivasan authored and David S. Miller committed Apr 8, 2017
1 parent 54a88e4 commit bffb184
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 14 deletions.
27 changes: 15 additions & 12 deletions drivers/net/hyperv/netvsc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1289,6 +1289,21 @@ int netvsc_device_add(struct hv_device *device,
*/
set_channel_read_mode(device->channel, HV_CALL_ISR);

/* If we're reopening the device we may have multiple queues, fill the
* chn_table with the default channel to use it before subchannels are
* opened.
* Initialize the channel state before we open;
* we can be interrupted as soon as we open the channel.
*/

for (i = 0; i < VRSS_CHANNEL_MAX; i++) {
struct netvsc_channel *nvchan = &net_device->chan_table[i];

nvchan->channel = device->channel;
netif_napi_add(ndev, &nvchan->napi,
netvsc_poll, NAPI_POLL_WEIGHT);
}

/* Open the channel */
ret = vmbus_open(device->channel, ring_size * PAGE_SIZE,
ring_size * PAGE_SIZE, NULL, 0,
Expand All @@ -1303,18 +1318,6 @@ int netvsc_device_add(struct hv_device *device,
/* Channel is opened */
netdev_dbg(ndev, "hv_netvsc channel opened successfully\n");

/* If we're reopening the device we may have multiple queues, fill the
* chn_table with the default channel to use it before subchannels are
* opened.
*/
for (i = 0; i < VRSS_CHANNEL_MAX; i++) {
struct netvsc_channel *nvchan = &net_device->chan_table[i];

nvchan->channel = device->channel;
netif_napi_add(ndev, &nvchan->napi,
netvsc_poll, NAPI_POLL_WEIGHT);
}

/* Enable NAPI handler for init callbacks */
napi_enable(&net_device->chan_table[0].napi);

Expand Down
5 changes: 3 additions & 2 deletions drivers/net/hyperv/rndis_filter.c
Original file line number Diff line number Diff line change
Expand Up @@ -1007,12 +1007,13 @@ static void netvsc_sc_open(struct vmbus_channel *new_sc)
*/
set_channel_read_mode(new_sc, HV_CALL_ISR);

/* Set the channel before opening.*/
nvchan->channel = new_sc;

ret = vmbus_open(new_sc, nvscdev->ring_size * PAGE_SIZE,
nvscdev->ring_size * PAGE_SIZE, NULL, 0,
netvsc_channel_cb, nvchan);

if (ret == 0)
nvchan->channel = new_sc;

napi_enable(&nvchan->napi);

Expand Down

0 comments on commit bffb184

Please sign in to comment.