mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-22 00:40:03 +00:00
net: properly flush delay-freed skbs
Typical NAPI drivers use napi_consume_skb(skb) at TX completion time. This put skb in a percpu special queue, napi_alloc_cache, to get bulk frees. It turns out the queue is not flushed and hits the NAPI_SKB_CACHE_SIZE limit quite often, with skbs that were queued hundreds of usec earlier. I measured this can take ~6000 nsec to perform one flush. __kfree_skb_flush() can be called from two points right now : 1) From net_tx_action(), but only for skbs that were queued to sd->completion_queue. -> Irrelevant for NAPI drivers in normal operation. 2) From net_rx_action(), but only under high stress or if RPS/RFS has a pending action. This patch changes net_rx_action() to perform the flush in all cases and after more urgent operations happened (like kicking remote CPUS for RPS/RFS). Signed-off-by: Eric Dumazet <edumazet@google.com> Cc: Jesper Dangaard Brouer <brouer@redhat.com> Cc: Alexander Duyck <alexander.h.duyck@intel.com> Acked-by: Alexander Duyck <alexander.h.duyck@intel.com> Acked-by: Jesper Dangaard Brouer <brouer@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ca89fa77b4
commit
f52dffe049
1 changed files with 3 additions and 2 deletions
|
@ -5260,7 +5260,7 @@ static __latent_entropy void net_rx_action(struct softirq_action *h)
|
|||
|
||||
if (list_empty(&list)) {
|
||||
if (!sd_has_rps_ipi_waiting(sd) && list_empty(&repoll))
|
||||
return;
|
||||
goto out;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -5278,7 +5278,6 @@ static __latent_entropy void net_rx_action(struct softirq_action *h)
|
|||
}
|
||||
}
|
||||
|
||||
__kfree_skb_flush();
|
||||
local_irq_disable();
|
||||
|
||||
list_splice_tail_init(&sd->poll_list, &list);
|
||||
|
@ -5288,6 +5287,8 @@ static __latent_entropy void net_rx_action(struct softirq_action *h)
|
|||
__raise_softirq_irqoff(NET_RX_SOFTIRQ);
|
||||
|
||||
net_rps_action_and_irq_enable(sd);
|
||||
out:
|
||||
__kfree_skb_flush();
|
||||
}
|
||||
|
||||
struct netdev_adjacent {
|
||||
|
|
Loading…
Reference in a new issue