]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: sparx5: fix FDMA performance issue
authorDaniel Machon <daniel.machon@microchip.com>
Thu, 5 Dec 2024 13:54:26 +0000 (14:54 +0100)
committerDavid S. Miller <davem@davemloft.net>
Mon, 9 Dec 2024 13:30:16 +0000 (13:30 +0000)
The FDMA handler is responsible for scheduling a NAPI poll, which will
eventually fetch RX packets from the FDMA queue. Currently, the FDMA
handler is run in a threaded context. For some reason, this kills
performance.  Admittedly, I did not do a thorough investigation to see
exactly what causes the issue, however, I noticed that in the other
driver utilizing the same FDMA engine, we run the FDMA handler in hard
IRQ context.

Fix this performance issue, by  running the FDMA handler in hard IRQ
context, not deferring any work to a thread.

Prior to this change, the RX UDP performance was:

Interval           Transfer     Bitrate         Jitter
0.00-10.20  sec    44.6 MBytes  36.7 Mbits/sec  0.027 ms

After this change, the rx UDP performance is:

Interval           Transfer     Bitrate         Jitter
0.00-9.12   sec    1.01 GBytes  953 Mbits/sec   0.020 ms

Fixes: 10615907e9b5 ("net: sparx5: switchdev: adding frame DMA functionality")
Signed-off-by: Daniel Machon <daniel.machon@microchip.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/microchip/sparx5/sparx5_main.c

index 2b58fcb9422e9a1be3dbd3df46477a9214494733..f61aa15beab7c677d243261d855d08a4922e7925 100644 (file)
@@ -780,12 +780,11 @@ static int sparx5_start(struct sparx5 *sparx5)
        err = -ENXIO;
        if (sparx5->fdma_irq >= 0 && is_sparx5(sparx5)) {
                if (GCB_CHIP_ID_REV_ID_GET(sparx5->chip_id) > 0)
-                       err = devm_request_threaded_irq(sparx5->dev,
-                                                       sparx5->fdma_irq,
-                                                       NULL,
-                                                       sparx5_fdma_handler,
-                                                       IRQF_ONESHOT,
-                                                       "sparx5-fdma", sparx5);
+                       err = devm_request_irq(sparx5->dev,
+                                              sparx5->fdma_irq,
+                                              sparx5_fdma_handler,
+                                              0,
+                                              "sparx5-fdma", sparx5);
                if (!err)
                        err = sparx5_fdma_start(sparx5);
                if (err)