Skip to content

Commit

Permalink
net: remove zap_completion_queue
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Eric Dumazet authored and David S. Miller committed May 31, 2010
1 parent 27f39c7 commit 15e83ed
Show file tree
Hide file tree
Showing 2 changed files with 3 additions and 32 deletions.
4 changes: 3 additions & 1 deletion net/core/dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
31 changes: 0 additions & 31 deletions net/core/netpoll.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand All @@ -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:

Expand Down

0 comments on commit 15e83ed

Please sign in to comment.