From: Gerhard Engleder Date: Tue, 23 Jan 2024 20:09:18 +0000 (+0100) Subject: tsnep: Fix XDP_RING_NEED_WAKEUP for empty fill ring X-Git-Tag: v6.7.3~126 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=246f72777e887f69c052129671c2e1dd009fea50;p=thirdparty%2Fkernel%2Fstable.git tsnep: Fix XDP_RING_NEED_WAKEUP for empty fill ring [ Upstream commit 9a91c05f4bd6f6bdd6b8f90445e0da92e3ac956c ] 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 Signed-off-by: Paolo Abeni Signed-off-by: Sasha Levin --- diff --git a/drivers/net/ethernet/engleder/tsnep_main.c b/drivers/net/ethernet/engleder/tsnep_main.c index 456e0336f3f66..9aeff2b37a612 100644 --- a/drivers/net/ethernet/engleder/tsnep_main.c +++ b/drivers/net/ethernet/engleder/tsnep_main.c @@ -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)