tsnep: Fix XDP_RING_NEED_WAKEUP for empty fill ring
authorGerhard Engleder <gerhard@engleder-embedded.com>
Tue, 23 Jan 2024 20:09:18 +0000 (21:09 +0100)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 25 Jan 2024 10:59:42 +0000 (11:59 +0100)
The fill ring of the XDP socket may contain not enough buffers to
completey fill the RX queue during socket creation. In this case the
flag XDP_RING_NEED_WAKEUP is not set as this flag is only set if the RX
queue is not completely filled during polling.

Set XDP_RING_NEED_WAKEUP flag also if RX queue is not completely filled
during XDP socket creation.

Fixes: 3fc2333933fd ("tsnep: Add XDP socket zero-copy RX support")
Signed-off-by: Gerhard Engleder <gerhard@engleder-embedded.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/engleder/tsnep_main.c

index 456e0336f3f6640b4a0f1b298cf2310824f08a1e..9aeff2b37a61299587c22dc39b207204c3412543 100644 (file)
@@ -1762,6 +1762,19 @@ static void tsnep_rx_reopen_xsk(struct tsnep_rx *rx)
                        allocated--;
                }
        }
+
+       /* set need wakeup flag immediately if ring is not filled completely,
+        * first polling would be too late as need wakeup signalisation would
+        * be delayed for an indefinite time
+        */
+       if (xsk_uses_need_wakeup(rx->xsk_pool)) {
+               int desc_available = tsnep_rx_desc_available(rx);
+
+               if (desc_available)
+                       xsk_set_rx_need_wakeup(rx->xsk_pool);
+               else
+                       xsk_clear_rx_need_wakeup(rx->xsk_pool);
+       }
 }
 
 static bool tsnep_pending(struct tsnep_queue *queue)