diff options
Diffstat (limited to 'net/core')
| -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 799f06e03a2..16db8870780 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c | |||
| @@ -1383,11 +1383,15 @@ static void neigh_proxy_process(unsigned long arg) | |||
| 1383 | 1383 | ||
| 1384 | if (tdif <= 0) { | 1384 | if (tdif <= 0) { |
| 1385 | struct net_device *dev = skb->dev; | 1385 | struct net_device *dev = skb->dev; |
| 1386 | |||
| 1386 | __skb_unlink(skb, &tbl->proxy_queue); | 1387 | __skb_unlink(skb, &tbl->proxy_queue); |
| 1387 | if (tbl->proxy_redo && netif_running(dev)) | 1388 | if (tbl->proxy_redo && netif_running(dev)) { |
| 1389 | rcu_read_lock(); | ||
| 1388 | tbl->proxy_redo(skb); | 1390 | tbl->proxy_redo(skb); |
| 1389 | else | 1391 | rcu_read_unlock(); |
| 1392 | } else { | ||
| 1390 | kfree_skb(skb); | 1393 | kfree_skb(skb); |
| 1394 | } | ||
| 1391 | 1395 | ||
| 1392 | dev_put(dev); | 1396 | dev_put(dev); |
| 1393 | } else if (!sched_next || tdif < sched_next) | 1397 | } else if (!sched_next || tdif < sched_next) |
