diff options
author | stephen hemminger <stephen@networkplumber.org> | 2017-07-19 21:53:18 +0300 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-07-20 08:20:05 +0300 |
commit | 35fbbccfb417385c1c8cc6f799154ea1ebdc22ef (patch) | |
tree | df956c396785926a4d78f4075fdfbd004e93f3a0 /drivers/net/hyperv/netvsc.c | |
parent | 2a926f791211b40ba114f45e0e7bfefd2fac5d30 (diff) | |
download | linux-35fbbccfb417385c1c8cc6f799154ea1ebdc22ef.tar.xz |
netvsc: save pointer to parent netvsc_device in channel table
Keep back pointer in the per-channel data structure to
avoid any possible RCU related issues when napi poll is
called but netvsc_device is in RCU limbo.
Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/hyperv/netvsc.c')
-rw-r--r-- | drivers/net/hyperv/netvsc.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c index 3c6f3ae520d9..c15640c6fd83 100644 --- a/drivers/net/hyperv/netvsc.c +++ b/drivers/net/hyperv/netvsc.c @@ -1224,11 +1224,11 @@ int netvsc_poll(struct napi_struct *napi, int budget) { struct netvsc_channel *nvchan = container_of(napi, struct netvsc_channel, napi); + struct netvsc_device *net_device = nvchan->net_device; struct vmbus_channel *channel = nvchan->channel; struct hv_device *device = netvsc_channel_to_device(channel); u16 q_idx = channel->offermsg.offer.sub_channel_index; struct net_device *ndev = hv_get_drvdata(device); - struct netvsc_device *net_device = net_device_to_netvsc_device(ndev); int work_done = 0; /* If starting a new interval */ @@ -1307,6 +1307,7 @@ struct netvsc_device *netvsc_device_add(struct hv_device *device, struct netvsc_channel *nvchan = &net_device->chan_table[i]; nvchan->channel = device->channel; + nvchan->net_device = net_device; } /* Enable NAPI handler before init callbacks */ |