net: ravb: Use NAPI threaded mode on 1-core CPUs with GbEth IP
authorPaul Barker <paul.barker.ct@bp.renesas.com>
Tue, 4 Jun 2024 07:28:24 +0000 (08:28 +0100)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 6 Jun 2024 07:59:58 +0000 (09:59 +0200)
NAPI Threaded mode (along with the previously enabled SW IRQ Coalescing)
is required to improve network stack performance for single core SoCs
using the GbEth IP (currently the RZ/G2L SoC family and the RZ/G3S SoC).

This patch gives the following improvements during testing with iperf3.

  * RZ/G2UL:
    * TCP TX: +32% bandwidth (638Mbps -> 841Mbps)
    * TXP RX: +8.8% bandwidth (667Mbps -> 726Mbps)
    * UDP RX: +104% bandwidth (53Mbps -> 108Mbps)

  * RZ/G3S:
    * TCP TX: 29% bandwidth (529Mbps -> 681Mbps)
    * UDP RX: +1290% bandwidth (6.46Mbps -> 90Mbps)

  * RZ/Five:
    * UDP RX: Test no longer crashes (0 -> 20 Mbps)

This patch gives the following reductions in performance in the same
testing:

  * RZ/G2UL:
    * UDP TX: -7.5% bandwidth (594Mbps -> 549Mbps)

  * RZ/G3S:
    * UDP TX: -5% bandwidth (625Mbps -> 594Mbps)

These losses are considered acceptable given the benefits shown above.
If UDP TX bandwidth must be maximised for a particular use case, NAPI
threaded mode can be disabled at runtime via sysfs writes.

The improvement of UDP RX bandwidth for the single core SoCs (RZ/G2UL &
RZ/G3S) is particularly critical.

Signed-off-by: Paul Barker <paul.barker.ct@bp.renesas.com>
Reviewed-by: Sergey Shtylyov <s.shtylyov@omp.ru>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/renesas/ravb_main.c

index 2c24cb0..c89bb38 100644 (file)
@@ -2944,8 +2944,11 @@ static int ravb_probe(struct platform_device *pdev)
        if (info->nc_queues)
                netif_napi_add(ndev, &priv->napi[RAVB_NC], ravb_poll);
 
-       if (info->coalesce_irqs)
+       if (info->coalesce_irqs) {
                netdev_sw_irq_coalesce_default_on(ndev);
+               if (num_present_cpus() == 1)
+                       dev_set_threaded(ndev, true);
+       }
 
        /* Network device register */
        error = register_netdev(ndev);