The only user of frag_size field in XDP RxQ info is
bpf_xdp_frags_increase_tail(). It clearly expects truesize instead of DMA
write size. Different assumptions in i40e driver configuration lead to
negative tailroom.

Set frag_size to the same value as frame_sz.

Fixes: a045d2f2d03d ("i40e: set xdp_rxq_info::frag_size")
Reviewed-by: Aleksandr Loktionov <[email protected]>
Signed-off-by: Larysa Zaremba <[email protected]>
---
 drivers/net/ethernet/intel/i40e/i40e_main.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c 
b/drivers/net/ethernet/intel/i40e/i40e_main.c
index 0b1cc0481027..72a33aa3e1f3 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -3561,6 +3561,7 @@ static int i40e_configure_rx_ring(struct i40e_ring *ring)
        struct i40e_vsi *vsi = ring->vsi;
        u32 chain_len = vsi->back->hw.func_caps.rx_buf_chain_len;
        u16 pf_q = vsi->base_queue + ring->queue_index;
+       u32 truesize = i40e_rx_pg_size(ring) / 2;
        struct i40e_hw *hw = &vsi->back->hw;
        struct i40e_hmc_obj_rxq rx_ctx;
        int err = 0;
@@ -3581,7 +3582,7 @@ static int i40e_configure_rx_ring(struct i40e_ring *ring)
                err = __xdp_rxq_info_reg(&ring->xdp_rxq, ring->netdev,
                                         ring->queue_index,
                                         ring->q_vector->napi.napi_id,
-                                        ring->rx_buf_len);
+                                        truesize);
                if (err)
                        return err;
        }
@@ -3614,7 +3615,7 @@ static int i40e_configure_rx_ring(struct i40e_ring *ring)
        }
 
 skip:
-       xdp_init_buff(&ring->xdp, i40e_rx_pg_size(ring) / 2, &ring->xdp_rxq);
+       xdp_init_buff(&ring->xdp, truesize, &ring->xdp_rxq);
 
        rx_ctx.dbuff = DIV_ROUND_UP(ring->rx_buf_len,
                                    BIT_ULL(I40E_RXQ_CTX_DBUFF_SHIFT));
-- 
2.52.0


Reply via email to