net: remove zap_completion_queue
authorEric Dumazet <eric.dumazet@gmail.com>
Wed, 19 May 2010 23:16:03 +0000 (23:16 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 31 May 2010 07:24:01 +0000 (00:24 -0700)
netpoll does an interesting work in zap_completion_queue(), but this was
before we did skb orphaning before delivering packets to device.

It now makes sense to add a test in dev_kfree_skb_irq() to not queue a
skb if already orphaned, and to remove netpoll zap_completion_queue() as
a bonus.

Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/dev.c
net/core/netpoll.c

index 7d76b056aa3d929deefdd6bb2ba41c38dd951d99..983a3c1d65c44a5a9eb3cfc5e842c94c6ecb61e7 100644 (file)
@@ -1577,7 +1577,9 @@ EXPORT_SYMBOL(__netif_schedule);
 
 void dev_kfree_skb_irq(struct sk_buff *skb)
 {
-       if (atomic_dec_and_test(&skb->users)) {
+       if (!skb->destructor)
+               dev_kfree_skb(skb);
+       else if (atomic_dec_and_test(&skb->users)) {
                struct softnet_data *sd;
                unsigned long flags;
 
index 94825b109551e81b1c22a09459b5e0262a97d5e4..e034342c819c6c5b1d16619386ff602d3472ddac 100644 (file)
@@ -49,7 +49,6 @@ static atomic_t trapped;
                (MAX_UDP_CHUNK + sizeof(struct udphdr) + \
                                sizeof(struct iphdr) + sizeof(struct ethhdr))
 
-static void zap_completion_queue(void);
 static void arp_reply(struct sk_buff *skb);
 
 static unsigned int carrier_timeout = 4;
@@ -197,7 +196,6 @@ void netpoll_poll_dev(struct net_device *dev)
 
        service_arp_queue(dev->npinfo);
 
-       zap_completion_queue();
 }
 
 void netpoll_poll(struct netpoll *np)
@@ -221,40 +219,11 @@ static void refill_skbs(void)
        spin_unlock_irqrestore(&skb_pool.lock, flags);
 }
 
-static void zap_completion_queue(void)
-{
-       unsigned long flags;
-       struct softnet_data *sd = &get_cpu_var(softnet_data);
-
-       if (sd->completion_queue) {
-               struct sk_buff *clist;
-
-               local_irq_save(flags);
-               clist = sd->completion_queue;
-               sd->completion_queue = NULL;
-               local_irq_restore(flags);
-
-               while (clist != NULL) {
-                       struct sk_buff *skb = clist;
-                       clist = clist->next;
-                       if (skb->destructor) {
-                               atomic_inc(&skb->users);
-                               dev_kfree_skb_any(skb); /* put this one back */
-                       } else {
-                               __kfree_skb(skb);
-                       }
-               }
-       }
-
-       put_cpu_var(softnet_data);
-}
-
 static struct sk_buff *find_skb(struct netpoll *np, int len, int reserve)
 {
        int count = 0;
        struct sk_buff *skb;
 
-       zap_completion_queue();
        refill_skbs();
 repeat: