diff --git a/[refs] b/[refs] index 5a280f821382..30e3b467bb4d 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 22df13319d1fec30b8f9bcaadc295829647109bb +refs/heads/master: 20e6074eb8e096b3a595c093d1cb222f378cd671 diff --git a/trunk/net/core/neighbour.c b/trunk/net/core/neighbour.c index 8fab9b0bb203..1334d7e56f02 100644 --- a/trunk/net/core/neighbour.c +++ b/trunk/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)