On Sun, Apr 02, 2023 at 09:38:38PM +0200, Gerhard Engleder wrote: > Send and complete XSK pool frames within TX NAPI context. NAPI context > is triggered by ndo_xsk_wakeup. > > Signed-off-by: Gerhard Engleder <gerhard@xxxxxxxxxxxxxxxxxxxxx> > --- > drivers/net/ethernet/engleder/tsnep.h | 2 + > drivers/net/ethernet/engleder/tsnep_main.c | 131 +++++++++++++++++++-- > 2 files changed, 123 insertions(+), 10 deletions(-) > (...) > +static void tsnep_xdp_xmit_zc(struct tsnep_tx *tx) > +{ > + int desc_available = tsnep_tx_desc_available(tx); > + struct xdp_desc xdp_desc; > + bool xmit = false; > + > + /* ensure that TX ring is not filled up by XDP, always MAX_SKB_FRAGS > + * will be available for normal TX path and queue is stopped there if > + * necessary > + */ > + if (desc_available <= (MAX_SKB_FRAGS + 1)) > + return; > + desc_available -= MAX_SKB_FRAGS + 1; > + > + while (xsk_tx_peek_desc(tx->xsk_pool, &xdp_desc) && desc_available--) { Again, I am curious how batch API usage would improve your perf. > + tsnep_xdp_xmit_frame_ring_zc(&xdp_desc, tx); > + xmit = true; > + } > + > + if (xmit) { > + tsnep_xdp_xmit_flush(tx); > + xsk_tx_release(tx->xsk_pool); > + } > +} > +