Commit 0719e72c authored by stephen hemminger's avatar stephen hemminger Committed by David S. Miller

netvsc: add rcu_read locking to netvsc callback

The receive callback (in tasklet context) is using RCU to get reference
to associated VF network device but this is not safe. RCU read lock
needs to be held. Found by running with full lockdep debugging
enabled.

Fixes: f207c10d ("hv_netvsc: use RCU to protect vf_netdev")
Signed-off-by: default avatarStephen Hemminger <sthemmin@microsoft.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4ecb1d83
...@@ -659,6 +659,7 @@ int netvsc_recv_callback(struct hv_device *device_obj, ...@@ -659,6 +659,7 @@ int netvsc_recv_callback(struct hv_device *device_obj,
* policy filters on the host). Deliver these via the VF * policy filters on the host). Deliver these via the VF
* interface in the guest. * interface in the guest.
*/ */
rcu_read_lock();
vf_netdev = rcu_dereference(net_device_ctx->vf_netdev); vf_netdev = rcu_dereference(net_device_ctx->vf_netdev);
if (vf_netdev && (vf_netdev->flags & IFF_UP)) if (vf_netdev && (vf_netdev->flags & IFF_UP))
net = vf_netdev; net = vf_netdev;
...@@ -667,6 +668,7 @@ int netvsc_recv_callback(struct hv_device *device_obj, ...@@ -667,6 +668,7 @@ int netvsc_recv_callback(struct hv_device *device_obj,
skb = netvsc_alloc_recv_skb(net, packet, csum_info, *data, vlan_tci); skb = netvsc_alloc_recv_skb(net, packet, csum_info, *data, vlan_tci);
if (unlikely(!skb)) { if (unlikely(!skb)) {
++net->stats.rx_dropped; ++net->stats.rx_dropped;
rcu_read_unlock();
return NVSP_STAT_FAIL; return NVSP_STAT_FAIL;
} }
...@@ -696,6 +698,7 @@ int netvsc_recv_callback(struct hv_device *device_obj, ...@@ -696,6 +698,7 @@ int netvsc_recv_callback(struct hv_device *device_obj,
* TODO - use NAPI? * TODO - use NAPI?
*/ */
netif_rx(skb); netif_rx(skb);
rcu_read_unlock();
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment