diff options
author | David S. Miller <davem@davemloft.net> | 2008-09-23 04:11:18 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-09-23 04:11:18 -0400 |
commit | f72051b0674f36c960698653a0583edaec1e495e (patch) | |
tree | ac150d8d86c7a128ebf02e39c9bf0196e21e293e | |
parent | f4ab543201992fe499bef5c406e09f23aa97b4d5 (diff) |
neigh: Remove by-hand SKB queue handling.
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/core/neighbour.c | 21 |
1 files changed, 8 insertions, 13 deletions
diff --git a/net/core/neighbour.c b/net/core/neighbour.c index 9d92e41826e7..1dc728b38589 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c | |||
@@ -927,8 +927,7 @@ int __neigh_event_send(struct neighbour *neigh, struct sk_buff *skb) | |||
927 | if (skb_queue_len(&neigh->arp_queue) >= | 927 | if (skb_queue_len(&neigh->arp_queue) >= |
928 | neigh->parms->queue_len) { | 928 | neigh->parms->queue_len) { |
929 | struct sk_buff *buff; | 929 | struct sk_buff *buff; |
930 | buff = neigh->arp_queue.next; | 930 | buff = __skb_dequeue(&neigh->arp_queue); |
931 | __skb_unlink(buff, &neigh->arp_queue); | ||
932 | kfree_skb(buff); | 931 | kfree_skb(buff); |
933 | NEIGH_CACHE_STAT_INC(neigh->tbl, unres_discards); | 932 | NEIGH_CACHE_STAT_INC(neigh->tbl, unres_discards); |
934 | } | 933 | } |
@@ -1259,24 +1258,20 @@ static void neigh_proxy_process(unsigned long arg) | |||
1259 | struct neigh_table *tbl = (struct neigh_table *)arg; | 1258 | struct neigh_table *tbl = (struct neigh_table *)arg; |
1260 | long sched_next = 0; | 1259 | long sched_next = 0; |
1261 | unsigned long now = jiffies; | 1260 | unsigned long now = jiffies; |
1262 | struct sk_buff *skb; | 1261 | struct sk_buff *skb, *n; |
1263 | 1262 | ||
1264 | spin_lock(&tbl->proxy_queue.lock); | 1263 | spin_lock(&tbl->proxy_queue.lock); |
1265 | 1264 | ||
1266 | skb = tbl->proxy_queue.next; | 1265 | skb_queue_walk_safe(&tbl->proxy_queue, skb, n) { |
1267 | 1266 | long tdif = NEIGH_CB(skb)->sched_next - now; | |
1268 | while (skb != (struct sk_buff *)&tbl->proxy_queue) { | ||
1269 | struct sk_buff *back = skb; | ||
1270 | long tdif = NEIGH_CB(back)->sched_next - now; | ||
1271 | 1267 | ||
1272 | skb = skb->next; | ||
1273 | if (tdif <= 0) { | 1268 | if (tdif <= 0) { |
1274 | struct net_device *dev = back->dev; | 1269 | struct net_device *dev = skb->dev; |
1275 | __skb_unlink(back, &tbl->proxy_queue); | 1270 | __skb_unlink(skb, &tbl->proxy_queue); |
1276 | if (tbl->proxy_redo && netif_running(dev)) | 1271 | if (tbl->proxy_redo && netif_running(dev)) |
1277 | tbl->proxy_redo(back); | 1272 | tbl->proxy_redo(skb); |
1278 | else | 1273 | else |
1279 | kfree_skb(back); | 1274 | kfree_skb(skb); |
1280 | 1275 | ||
1281 | dev_put(dev); | 1276 | dev_put(dev); |
1282 | } else if (!sched_next || tdif < sched_next) | 1277 | } else if (!sched_next || tdif < sched_next) |