forked from luck/tmp_suning_uos_patched
net: remove zap_completion_queue
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>
This commit is contained in:
parent
27f39c73e6
commit
15e83ed788
|
@ -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;
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user