mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 02:50:49 +09:00
netvsc: add rcu_read locking to netvsc callback
[ Upstream commit0719e72ccb] 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:f207c10d98("hv_netvsc: use RCU to protect vf_netdev") Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
a37f2311e6
commit
5b3df44010
@@ -659,6 +659,7 @@ int netvsc_recv_callback(struct hv_device *device_obj,
|
||||
* policy filters on the host). Deliver these via the VF
|
||||
* interface in the guest.
|
||||
*/
|
||||
rcu_read_lock();
|
||||
vf_netdev = rcu_dereference(net_device_ctx->vf_netdev);
|
||||
if (vf_netdev && (vf_netdev->flags & IFF_UP))
|
||||
net = vf_netdev;
|
||||
@@ -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);
|
||||
if (unlikely(!skb)) {
|
||||
++net->stats.rx_dropped;
|
||||
rcu_read_unlock();
|
||||
return NVSP_STAT_FAIL;
|
||||
}
|
||||
|
||||
@@ -696,6 +698,7 @@ int netvsc_recv_callback(struct hv_device *device_obj,
|
||||
* TODO - use NAPI?
|
||||
*/
|
||||
netif_rx(skb);
|
||||
rcu_read_unlock();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user