mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-01-21 17:51:17 +07:00
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)
|
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;
|
struct softnet_data *sd;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
|
@ -49,7 +49,6 @@ static atomic_t trapped;
|
|||||||
(MAX_UDP_CHUNK + sizeof(struct udphdr) + \
|
(MAX_UDP_CHUNK + sizeof(struct udphdr) + \
|
||||||
sizeof(struct iphdr) + sizeof(struct ethhdr))
|
sizeof(struct iphdr) + sizeof(struct ethhdr))
|
||||||
|
|
||||||
static void zap_completion_queue(void);
|
|
||||||
static void arp_reply(struct sk_buff *skb);
|
static void arp_reply(struct sk_buff *skb);
|
||||||
|
|
||||||
static unsigned int carrier_timeout = 4;
|
static unsigned int carrier_timeout = 4;
|
||||||
@ -197,7 +196,6 @@ void netpoll_poll_dev(struct net_device *dev)
|
|||||||
|
|
||||||
service_arp_queue(dev->npinfo);
|
service_arp_queue(dev->npinfo);
|
||||||
|
|
||||||
zap_completion_queue();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void netpoll_poll(struct netpoll *np)
|
void netpoll_poll(struct netpoll *np)
|
||||||
@ -221,40 +219,11 @@ static void refill_skbs(void)
|
|||||||
spin_unlock_irqrestore(&skb_pool.lock, flags);
|
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)
|
static struct sk_buff *find_skb(struct netpoll *np, int len, int reserve)
|
||||||
{
|
{
|
||||||
int count = 0;
|
int count = 0;
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
|
|
||||||
zap_completion_queue();
|
|
||||||
refill_skbs();
|
refill_skbs();
|
||||||
repeat:
|
repeat:
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user