diff options
Diffstat (limited to 'net/core/neighbour.c')
| -rw-r--r-- | net/core/neighbour.c | 8 | 
1 files changed, 6 insertions, 2 deletions
diff --git a/net/core/neighbour.c b/net/core/neighbour.c index 8fab9b0bb20..1334d7e56f0 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c @@ -1319,11 +1319,15 @@ static void neigh_proxy_process(unsigned long arg)  		if (tdif <= 0) {  			struct net_device *dev = skb->dev; +  			__skb_unlink(skb, &tbl->proxy_queue); -			if (tbl->proxy_redo && netif_running(dev)) +			if (tbl->proxy_redo && netif_running(dev)) { +				rcu_read_lock();  				tbl->proxy_redo(skb); -			else +				rcu_read_unlock(); +			} else {  				kfree_skb(skb); +			}  			dev_put(dev);  		} else if (!sched_next || tdif < sched_next)  |