From f5decb135fda8ba748a0f18588161098d7e5da78 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Wed, 19 May 2010 23:16:03 +0000 Subject: [PATCH] --- yaml --- r: 202576 b: refs/heads/master c: 15e83ed78864d0625e87a85f09b297c0919a4797 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/net/core/dev.c | 4 +++- trunk/net/core/netpoll.c | 31 ------------------------------- 3 files changed, 4 insertions(+), 33 deletions(-) diff --git a/[refs] b/[refs] index ce9d969cee18..d9704c7c6b12 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 27f39c73e63833b4c081a0d681d88b4184a0491d +refs/heads/master: 15e83ed78864d0625e87a85f09b297c0919a4797 diff --git a/trunk/net/core/dev.c b/trunk/net/core/dev.c index 7d76b056aa3d..983a3c1d65c4 100644 --- a/trunk/net/core/dev.c +++ b/trunk/net/core/dev.c @@ -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; diff --git a/trunk/net/core/netpoll.c b/trunk/net/core/netpoll.c index 94825b109551..e034342c819c 100644 --- a/trunk/net/core/netpoll.c +++ b/trunk/net/core/netpoll.c @@ -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: