Skip to content
/ linux Public

Commit 7f46fd8

Browse files
walking-machinegregkh
authored andcommitted
i40e: fix registering XDP RxQ info
[ Upstream commit 8f497dc ] Current way of handling XDP RxQ info in i40e has a problem, where frag_size is not updated when xsk_buff_pool is detached or when MTU is changed, this leads to growing tail always failing for multi-buffer packets. Couple XDP RxQ info registering with buffer allocations and unregistering with cleaning the ring. Fixes: a045d2f ("i40e: set xdp_rxq_info::frag_size") Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com> Signed-off-by: Larysa Zaremba <larysa.zaremba@intel.com> Link: https://patch.msgid.link/20260305111253.2317394-6-larysa.zaremba@intel.com Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent addccd4 commit 7f46fd8

File tree

2 files changed

+22
-17
lines changed

2 files changed

+22
-17
lines changed

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

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3633,18 +3633,8 @@ static int i40e_configure_rx_ring(struct i40e_ring *ring)
36333633
if (ring->vsi->type != I40E_VSI_MAIN)
36343634
goto skip;
36353635

3636-
if (!xdp_rxq_info_is_reg(&ring->xdp_rxq)) {
3637-
err = __xdp_rxq_info_reg(&ring->xdp_rxq, ring->netdev,
3638-
ring->queue_index,
3639-
ring->q_vector->napi.napi_id,
3640-
ring->rx_buf_len);
3641-
if (err)
3642-
return err;
3643-
}
3644-
36453636
ring->xsk_pool = i40e_xsk_pool(ring);
36463637
if (ring->xsk_pool) {
3647-
xdp_rxq_info_unreg(&ring->xdp_rxq);
36483638
ring->rx_buf_len = xsk_pool_get_rx_frame_size(ring->xsk_pool);
36493639
err = __xdp_rxq_info_reg(&ring->xdp_rxq, ring->netdev,
36503640
ring->queue_index,
@@ -3656,17 +3646,23 @@ static int i40e_configure_rx_ring(struct i40e_ring *ring)
36563646
MEM_TYPE_XSK_BUFF_POOL,
36573647
NULL);
36583648
if (err)
3659-
return err;
3649+
goto unreg_xdp;
36603650
dev_info(&vsi->back->pdev->dev,
36613651
"Registered XDP mem model MEM_TYPE_XSK_BUFF_POOL on Rx ring %d\n",
36623652
ring->queue_index);
36633653

36643654
} else {
3655+
err = __xdp_rxq_info_reg(&ring->xdp_rxq, ring->netdev,
3656+
ring->queue_index,
3657+
ring->q_vector->napi.napi_id,
3658+
ring->rx_buf_len);
3659+
if (err)
3660+
return err;
36653661
err = xdp_rxq_info_reg_mem_model(&ring->xdp_rxq,
36663662
MEM_TYPE_PAGE_SHARED,
36673663
NULL);
36683664
if (err)
3669-
return err;
3665+
goto unreg_xdp;
36703666
}
36713667

36723668
skip:
@@ -3704,7 +3700,8 @@ static int i40e_configure_rx_ring(struct i40e_ring *ring)
37043700
dev_info(&vsi->back->pdev->dev,
37053701
"Failed to clear LAN Rx queue context on Rx ring %d (pf_q %d), error: %d\n",
37063702
ring->queue_index, pf_q, err);
3707-
return -ENOMEM;
3703+
err = -ENOMEM;
3704+
goto unreg_xdp;
37083705
}
37093706

37103707
/* set the context in the HMC */
@@ -3713,15 +3710,17 @@ static int i40e_configure_rx_ring(struct i40e_ring *ring)
37133710
dev_info(&vsi->back->pdev->dev,
37143711
"Failed to set LAN Rx queue context on Rx ring %d (pf_q %d), error: %d\n",
37153712
ring->queue_index, pf_q, err);
3716-
return -ENOMEM;
3713+
err = -ENOMEM;
3714+
goto unreg_xdp;
37173715
}
37183716

37193717
/* configure Rx buffer alignment */
37203718
if (!vsi->netdev || test_bit(I40E_FLAG_LEGACY_RX_ENA, vsi->back->flags)) {
37213719
if (I40E_2K_TOO_SMALL_WITH_PADDING) {
37223720
dev_info(&vsi->back->pdev->dev,
37233721
"2k Rx buffer is too small to fit standard MTU and skb_shared_info\n");
3724-
return -EOPNOTSUPP;
3722+
err = -EOPNOTSUPP;
3723+
goto unreg_xdp;
37253724
}
37263725
clear_ring_build_skb_enabled(ring);
37273726
} else {
@@ -3751,6 +3750,11 @@ static int i40e_configure_rx_ring(struct i40e_ring *ring)
37513750
}
37523751

37533752
return 0;
3753+
unreg_xdp:
3754+
if (ring->vsi->type == I40E_VSI_MAIN)
3755+
xdp_rxq_info_unreg(&ring->xdp_rxq);
3756+
3757+
return err;
37543758
}
37553759

37563760
/**

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1469,6 +1469,9 @@ void i40e_clean_rx_ring(struct i40e_ring *rx_ring)
14691469
if (!rx_ring->rx_bi)
14701470
return;
14711471

1472+
if (xdp_rxq_info_is_reg(&rx_ring->xdp_rxq))
1473+
xdp_rxq_info_unreg(&rx_ring->xdp_rxq);
1474+
14721475
if (rx_ring->xsk_pool) {
14731476
i40e_xsk_clean_rx_ring(rx_ring);
14741477
goto skip_free;
@@ -1526,8 +1529,6 @@ void i40e_clean_rx_ring(struct i40e_ring *rx_ring)
15261529
void i40e_free_rx_resources(struct i40e_ring *rx_ring)
15271530
{
15281531
i40e_clean_rx_ring(rx_ring);
1529-
if (rx_ring->vsi->type == I40E_VSI_MAIN)
1530-
xdp_rxq_info_unreg(&rx_ring->xdp_rxq);
15311532
rx_ring->xdp_prog = NULL;
15321533
kfree(rx_ring->rx_bi);
15331534
rx_ring->rx_bi = NULL;

0 commit comments

Comments
 (0)