Skip to content

Commit c69d22c

Browse files
walking-machinekuba-moo
authored andcommitted
i40e: use xdp.frame_sz as XDP RxQ info frag_size
The only user of frag_size field in XDP RxQ info is bpf_xdp_frags_increase_tail(). It clearly expects whole buffer size 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 in shared pages mode, use new helper to set frag_size when AF_XDP ZC is active. Fixes: a045d2f ("i40e: set xdp_rxq_info::frag_size") Reviewed-by: Aleksandr Loktionov <[email protected]> Signed-off-by: Larysa Zaremba <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 8f497dc commit c69d22c

1 file changed

Lines changed: 6 additions & 3 deletions

File tree

drivers/net/ethernet/intel/i40e/i40e_main.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3569,6 +3569,7 @@ static int i40e_configure_rx_ring(struct i40e_ring *ring)
35693569
u16 pf_q = vsi->base_queue + ring->queue_index;
35703570
struct i40e_hw *hw = &vsi->back->hw;
35713571
struct i40e_hmc_obj_rxq rx_ctx;
3572+
u32 xdp_frame_sz;
35723573
int err = 0;
35733574
bool ok;
35743575

@@ -3578,18 +3579,20 @@ static int i40e_configure_rx_ring(struct i40e_ring *ring)
35783579
memset(&rx_ctx, 0, sizeof(rx_ctx));
35793580

35803581
ring->rx_buf_len = vsi->rx_buf_len;
3582+
xdp_frame_sz = i40e_rx_pg_size(ring) / 2;
35813583

35823584
/* XDP RX-queue info only needed for RX rings exposed to XDP */
35833585
if (ring->vsi->type != I40E_VSI_MAIN)
35843586
goto skip;
35853587

35863588
ring->xsk_pool = i40e_xsk_pool(ring);
35873589
if (ring->xsk_pool) {
3590+
xdp_frame_sz = xsk_pool_get_rx_frag_step(ring->xsk_pool);
35883591
ring->rx_buf_len = xsk_pool_get_rx_frame_size(ring->xsk_pool);
35893592
err = __xdp_rxq_info_reg(&ring->xdp_rxq, ring->netdev,
35903593
ring->queue_index,
35913594
ring->q_vector->napi.napi_id,
3592-
ring->rx_buf_len);
3595+
xdp_frame_sz);
35933596
if (err)
35943597
return err;
35953598
err = xdp_rxq_info_reg_mem_model(&ring->xdp_rxq,
@@ -3605,7 +3608,7 @@ static int i40e_configure_rx_ring(struct i40e_ring *ring)
36053608
err = __xdp_rxq_info_reg(&ring->xdp_rxq, ring->netdev,
36063609
ring->queue_index,
36073610
ring->q_vector->napi.napi_id,
3608-
ring->rx_buf_len);
3611+
xdp_frame_sz);
36093612
if (err)
36103613
return err;
36113614
err = xdp_rxq_info_reg_mem_model(&ring->xdp_rxq,
@@ -3616,7 +3619,7 @@ static int i40e_configure_rx_ring(struct i40e_ring *ring)
36163619
}
36173620

36183621
skip:
3619-
xdp_init_buff(&ring->xdp, i40e_rx_pg_size(ring) / 2, &ring->xdp_rxq);
3622+
xdp_init_buff(&ring->xdp, xdp_frame_sz, &ring->xdp_rxq);
36203623

36213624
rx_ctx.dbuff = DIV_ROUND_UP(ring->rx_buf_len,
36223625
BIT_ULL(I40E_RXQ_CTX_DBUFF_SHIFT));

0 commit comments

Comments
 (0)