net: call skb_defer_free_flush() before each napi_poll()
authorEric Dumazet <edumazet@google.com>
Mon, 16 May 2022 04:24:56 +0000 (21:24 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 16 May 2022 10:33:59 +0000 (11:33 +0100)
skb_defer_free_flush() can consume cpu cycles,
it seems better to call it in the inner loop:

- Potentially frees page/skb that will be reallocated while hot.

- Account for the cpu cycles in the @time_limit determination.

- Keep softnet_data.defer_count small to reduce chances for
  skb_attempt_defer_free() to send an IPI.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/dev.c

index 6359f89..04fd056 100644 (file)
@@ -6655,6 +6655,8 @@ static __latent_entropy void net_rx_action(struct softirq_action *h)
        for (;;) {
                struct napi_struct *n;
 
+               skb_defer_free_flush(sd);
+
                if (list_empty(&list)) {
                        if (!sd_has_rps_ipi_waiting(sd) && list_empty(&repoll))
                                goto end;
@@ -6684,8 +6686,7 @@ static __latent_entropy void net_rx_action(struct softirq_action *h)
                __raise_softirq_irqoff(NET_RX_SOFTIRQ);
 
        net_rps_action_and_irq_enable(sd);
-end:
-       skb_defer_free_flush(sd);
+end:;
 }
 
 struct netdev_adjacent {