When programming dbuff on rx queue context, avoid division round up as it causes to actually corrupt the tailroom for AF_XDP ZC. Below is an example based on 4k chunk size when xsk pool pointer is valid on given rx ring: chunk_size = 4096 headroom = 256 tailroom = 320 ring->rx_buf_len = 4096 - 256 - 320 = 3520 rx_ctx.dbuff = DIV_ROUND_UP(3520, 128) -> 3520 / 128 = 27.5 -> round up results in 28 dbuff programming unit is 128. If we give 128 * 28 = 3584. So HW will corrupt 64 bytes from tailroom. Decrement dbuff value when xsk_pool is present on i40e's rx ring. Fixes: 1c9ba9c14658 ("i40e: xsk: add RX multi-buffer support") Signed-off-by: Maciej Fijalkowski --- drivers/net/ethernet/intel/i40e/i40e_main.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index 926d001b2150..9fd55145eeee 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c @@ -3623,6 +3623,8 @@ static int i40e_configure_rx_ring(struct i40e_ring *ring) rx_ctx.dbuff = DIV_ROUND_UP(ring->rx_buf_len, BIT_ULL(I40E_RXQ_CTX_DBUFF_SHIFT)); + if (ring->xsk_pool) + rx_ctx.dbuff--; rx_ctx.base = (ring->dma / 128); rx_ctx.qlen = ring->count; -- 2.43.0