Skip to content

Commit cf440e5

Browse files
committed
Merge branch 'Address-XDP-frags-having-negative-tailroom'
Larysa Zaremba says: ==================== Address XDP frags having negative tailroom Aside from the issue described below, tailroom calculation does not account for pages being split between frags, e.g. in i40e, enetc and AF_XDP ZC with smaller chunks. These series address the problem by calculating modulo (skb_frag_off() % rxq->frag_size) in order to get data offset within a smaller block of memory. Please note, xskxceiver tail grow test passes without modulo e.g. in xdpdrv mode on i40e, because there is not enough descriptors to get to flipped buffers. Many ethernet drivers report xdp Rx queue frag size as being the same as DMA write size. However, the only user of this field, namely bpf_xdp_frags_increase_tail(), clearly expects a truesize. Such difference leads to unspecific memory corruption issues under certain circumstances, e.g. in ixgbevf maximum DMA write size is 3 KB, so when running xskxceiver's XDP_ADJUST_TAIL_GROW_MULTI_BUFF, 6K packet fully uses all DMA-writable space in 2 buffers. This would be fine, if only rxq->frag_size was properly set to 4K, but value of 3K results in a negative tailroom, because there is a non-zero page offset. We are supposed to return -EINVAL and be done with it in such case, but due to tailroom being stored as an unsigned int, it is reported to be somewhere near UINT_MAX, resulting in a tail being grown, even if the requested offset is too much(it is around 2K in the abovementioned test). This later leads to all kinds of unspecific calltraces. [ 7340.337579] xskxceiver[1440]: segfault at 1da718 ip 00007f4161aeac9d sp 00007f41615a6a00 error 6 [ 7340.338040] xskxceiver[1441]: segfault at 7f410000000b ip 00000000004042b5 sp 00007f415bffecf0 error 4 [ 7340.338179] in libc.so.6[61c9d,7f4161aaf000+160000] [ 7340.339230] in xskxceiver[42b5,400000+69000] [ 7340.340300] likely on CPU 6 (core 0, socket 6) [ 7340.340302] Code: ff ff 01 e9 f4 fe ff ff 0f 1f 44 00 00 4c 39 f0 74 73 31 c0 ba 01 00 00 00 f0 0f b1 17 0f 85 ba 00 00 00 49 8b 87 88 00 00 00 <4c> 89 70 08 eb cc 0f 1f 44 00 00 48 8d bd f0 fe ff ff 89 85 ec fe [ 7340.340888] likely on CPU 3 (core 0, socket 3) [ 7340.345088] Code: 00 00 00 ba 00 00 00 00 be 00 00 00 00 89 c7 e8 31 ca ff ff 89 45 ec 8b 45 ec 85 c0 78 07 b8 00 00 00 00 eb 46 e8 0b c8 ff ff <8b> 00 83 f8 69 74 24 e8 ff c7 ff ff 8b 00 83 f8 0b 74 18 e8 f3 c7 [ 7340.404334] Oops: general protection fault, probably for non-canonical address 0x6d255010bdffc: 0000 [#1] SMP NOPTI [ 7340.405972] CPU: 7 UID: 0 PID: 1439 Comm: xskxceiver Not tainted 6.19.0-rc1+ #21 PREEMPT(lazy) [ 7340.408006] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.17.0-5.fc42 04/01/2014 [ 7340.409716] RIP: 0010:lookup_swap_cgroup_id+0x44/0x80 [ 7340.410455] Code: 83 f8 1c 73 39 48 ba ff ff ff ff ff ff ff 03 48 8b 04 c5 20 55 fa bd 48 21 d1 48 89 ca 83 e1 01 48 d1 ea c1 e1 04 48 8d 04 90 <8b> 00 48 83 c4 10 d3 e8 c3 cc cc cc cc 31 c0 e9 98 b7 dd 00 48 89 [ 7340.412787] RSP: 0018:ffffcc5c04f7f6d0 EFLAGS: 00010202 [ 7340.413494] RAX: 0006d255010bdffc RBX: ffff891f477895a8 RCX: 0000000000000010 [ 7340.414431] RDX: 0001c17e3fffffff RSI: 00fa070000000000 RDI: 000382fc7fffffff [ 7340.415354] RBP: 00fa070000000000 R08: ffffcc5c04f7f8f8 R09: ffffcc5c04f7f7d0 [ 7340.416283] R10: ffff891f4c1a7000 R11: ffffcc5c04f7f9c8 R12: ffffcc5c04f7f7d0 [ 7340.417218] R13: 03ffffffffffffff R14: 00fa06fffffffe00 R15: ffff891f47789500 [ 7340.418229] FS: 0000000000000000(0000) GS:ffff891ffdfaa000(0000) knlGS:0000000000000000 [ 7340.419489] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 7340.420286] CR2: 00007f415bfffd58 CR3: 0000000103f03002 CR4: 0000000000772ef0 [ 7340.421237] PKRU: 55555554 [ 7340.421623] Call Trace: [ 7340.421987] <TASK> [ 7340.422309] ? softleaf_from_pte+0x77/0xa0 [ 7340.422855] swap_pte_batch+0xa7/0x290 [ 7340.423363] zap_nonpresent_ptes.constprop.0.isra.0+0xd1/0x270 [ 7340.424102] zap_pte_range+0x281/0x580 [ 7340.424607] zap_pmd_range.isra.0+0xc9/0x240 [ 7340.425177] unmap_page_range+0x24d/0x420 [ 7340.425714] unmap_vmas+0xa1/0x180 [ 7340.426185] exit_mmap+0xe1/0x3b0 [ 7340.426644] __mmput+0x41/0x150 [ 7340.427098] exit_mm+0xb1/0x110 [ 7340.427539] do_exit+0x1b2/0x460 [ 7340.427992] do_group_exit+0x2d/0xc0 [ 7340.428477] get_signal+0x79d/0x7e0 [ 7340.428957] arch_do_signal_or_restart+0x34/0x100 [ 7340.429571] exit_to_user_mode_loop+0x8e/0x4c0 [ 7340.430159] do_syscall_64+0x188/0x6b0 [ 7340.430672] ? __do_sys_clone3+0xd9/0x120 [ 7340.431212] ? switch_fpu_return+0x4e/0xd0 [ 7340.431761] ? arch_exit_to_user_mode_prepare.isra.0+0xa1/0xc0 [ 7340.432498] ? do_syscall_64+0xbb/0x6b0 [ 7340.433015] ? __handle_mm_fault+0x445/0x690 [ 7340.433582] ? count_memcg_events+0xd6/0x210 [ 7340.434151] ? handle_mm_fault+0x212/0x340 [ 7340.434697] ? do_user_addr_fault+0x2b4/0x7b0 [ 7340.435271] ? clear_bhb_loop+0x30/0x80 [ 7340.435788] ? clear_bhb_loop+0x30/0x80 [ 7340.436299] ? clear_bhb_loop+0x30/0x80 [ 7340.436812] ? clear_bhb_loop+0x30/0x80 [ 7340.437323] entry_SYSCALL_64_after_hwframe+0x76/0x7e [ 7340.437973] RIP: 0033:0x7f4161b14169 [ 7340.438468] Code: Unable to access opcode bytes at 0x7f4161b1413f. [ 7340.439242] RSP: 002b:00007ffc6ebfa770 EFLAGS: 00000246 ORIG_RAX: 00000000000000ca [ 7340.440173] RAX: fffffffffffffe00 RBX: 00000000000005a1 RCX: 00007f4161b14169 [ 7340.441061] RDX: 00000000000005a1 RSI: 0000000000000109 RDI: 00007f415bfff990 [ 7340.441943] RBP: 00007ffc6ebfa7a0 R08: 0000000000000000 R09: 00000000ffffffff [ 7340.442824] R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000 [ 7340.443707] R13: 0000000000000000 R14: 00007f415bfff990 R15: 00007f415bfff6c0 [ 7340.444586] </TASK> [ 7340.444922] Modules linked in: rfkill intel_rapl_msr intel_rapl_common intel_uncore_frequency_common skx_edac_common nfit libnvdimm kvm_intel vfat fat kvm snd_pcm irqbypass rapl iTCO_wdt snd_timer intel_pmc_bxt iTCO_vendor_support snd ixgbevf virtio_net soundcore i2c_i801 pcspkr libeth_xdp net_failover i2c_smbus lpc_ich failover libeth virtio_balloon joydev 9p fuse loop zram lz4hc_compress lz4_compress 9pnet_virtio 9pnet netfs ghash_clmulni_intel serio_raw qemu_fw_cfg [ 7340.449650] ---[ end trace 0000000000000000 ]--- The issue can be fixed in all in-tree drivers, but we cannot just trust OOT drivers to not do this. Therefore, make tailroom a signed int and produce a warning when it is negative to prevent such mistakes in the future. The issue can also be easily reproduced with ice driver, by applying the following diff to xskxceiver and enjoying a kernel panic in xdpdrv mode: diff --git a/tools/testing/selftests/bpf/prog_tests/test_xsk.c b/tools/testing/selftests/bpf/prog_tests/test_xsk.c index 5af28f3..042d587fa7ef 100644 --- a/tools/testing/selftests/bpf/prog_tests/test_xsk.c +++ b/tools/testing/selftests/bpf/prog_tests/test_xsk.c @@ -2541,8 +2541,8 @@ int testapp_adjust_tail_grow_mb(struct test_spec *test) { test->mtu = MAX_ETH_JUMBO_SIZE; /* Grow by (frag_size - last_frag_Size) - 1 to stay inside the last fragment */ - return testapp_adjust_tail(test, (XSK_UMEM__MAX_FRAME_SIZE / 2) - 1, - XSK_UMEM__LARGE_FRAME_SIZE * 2); + return testapp_adjust_tail(test, XSK_UMEM__MAX_FRAME_SIZE * 100, + 6912); } int testapp_tx_queue_consumer(struct test_spec *test) If we print out the values involved in the tailroom calculation: tailroom = rxq->frag_size - skb_frag_size(frag) - skb_frag_off(frag); 4294967040 = 3456 - 3456 - 256 I personally reproduced and verified the issue in ice and i40e, aside from WiP ixgbevf implementation. ==================== Link: https://patch.msgid.link/20260305111253.2317394-1-larysa.zaremba@intel.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2 parents 5d1271f + 8821e85 commit cf440e5

File tree

13 files changed

+69
-47
lines changed

13 files changed

+69
-47
lines changed

drivers/net/ethernet/freescale/enetc/enetc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3467,7 +3467,7 @@ static int enetc_int_vector_init(struct enetc_ndev_priv *priv, int i,
34673467
priv->rx_ring[i] = bdr;
34683468

34693469
err = __xdp_rxq_info_reg(&bdr->xdp.rxq, priv->ndev, i, 0,
3470-
ENETC_RXB_DMA_SIZE_XDP);
3470+
ENETC_RXB_TRUESIZE);
34713471
if (err)
34723472
goto free_vector;
34733473

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

Lines changed: 24 additions & 17 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,49 +3579,47 @@ 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

3586-
if (!xdp_rxq_info_is_reg(&ring->xdp_rxq)) {
3587-
err = __xdp_rxq_info_reg(&ring->xdp_rxq, ring->netdev,
3588-
ring->queue_index,
3589-
ring->q_vector->napi.napi_id,
3590-
ring->rx_buf_len);
3591-
if (err)
3592-
return err;
3593-
}
3594-
35953588
ring->xsk_pool = i40e_xsk_pool(ring);
35963589
if (ring->xsk_pool) {
3597-
xdp_rxq_info_unreg(&ring->xdp_rxq);
3590+
xdp_frame_sz = xsk_pool_get_rx_frag_step(ring->xsk_pool);
35983591
ring->rx_buf_len = xsk_pool_get_rx_frame_size(ring->xsk_pool);
35993592
err = __xdp_rxq_info_reg(&ring->xdp_rxq, ring->netdev,
36003593
ring->queue_index,
36013594
ring->q_vector->napi.napi_id,
3602-
ring->rx_buf_len);
3595+
xdp_frame_sz);
36033596
if (err)
36043597
return err;
36053598
err = xdp_rxq_info_reg_mem_model(&ring->xdp_rxq,
36063599
MEM_TYPE_XSK_BUFF_POOL,
36073600
NULL);
36083601
if (err)
3609-
return err;
3602+
goto unreg_xdp;
36103603
dev_info(&vsi->back->pdev->dev,
36113604
"Registered XDP mem model MEM_TYPE_XSK_BUFF_POOL on Rx ring %d\n",
36123605
ring->queue_index);
36133606

36143607
} else {
3608+
err = __xdp_rxq_info_reg(&ring->xdp_rxq, ring->netdev,
3609+
ring->queue_index,
3610+
ring->q_vector->napi.napi_id,
3611+
xdp_frame_sz);
3612+
if (err)
3613+
return err;
36153614
err = xdp_rxq_info_reg_mem_model(&ring->xdp_rxq,
36163615
MEM_TYPE_PAGE_SHARED,
36173616
NULL);
36183617
if (err)
3619-
return err;
3618+
goto unreg_xdp;
36203619
}
36213620

36223621
skip:
3623-
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);
36243623

36253624
rx_ctx.dbuff = DIV_ROUND_UP(ring->rx_buf_len,
36263625
BIT_ULL(I40E_RXQ_CTX_DBUFF_SHIFT));
@@ -3654,7 +3653,8 @@ static int i40e_configure_rx_ring(struct i40e_ring *ring)
36543653
dev_info(&vsi->back->pdev->dev,
36553654
"Failed to clear LAN Rx queue context on Rx ring %d (pf_q %d), error: %d\n",
36563655
ring->queue_index, pf_q, err);
3657-
return -ENOMEM;
3656+
err = -ENOMEM;
3657+
goto unreg_xdp;
36583658
}
36593659

36603660
/* set the context in the HMC */
@@ -3663,15 +3663,17 @@ static int i40e_configure_rx_ring(struct i40e_ring *ring)
36633663
dev_info(&vsi->back->pdev->dev,
36643664
"Failed to set LAN Rx queue context on Rx ring %d (pf_q %d), error: %d\n",
36653665
ring->queue_index, pf_q, err);
3666-
return -ENOMEM;
3666+
err = -ENOMEM;
3667+
goto unreg_xdp;
36673668
}
36683669

36693670
/* configure Rx buffer alignment */
36703671
if (!vsi->netdev || test_bit(I40E_FLAG_LEGACY_RX_ENA, vsi->back->flags)) {
36713672
if (I40E_2K_TOO_SMALL_WITH_PADDING) {
36723673
dev_info(&vsi->back->pdev->dev,
36733674
"2k Rx buffer is too small to fit standard MTU and skb_shared_info\n");
3674-
return -EOPNOTSUPP;
3675+
err = -EOPNOTSUPP;
3676+
goto unreg_xdp;
36753677
}
36763678
clear_ring_build_skb_enabled(ring);
36773679
} else {
@@ -3701,6 +3703,11 @@ static int i40e_configure_rx_ring(struct i40e_ring *ring)
37013703
}
37023704

37033705
return 0;
3706+
unreg_xdp:
3707+
if (ring->vsi->type == I40E_VSI_MAIN)
3708+
xdp_rxq_info_unreg(&ring->xdp_rxq);
3709+
3710+
return err;
37043711
}
37053712

37063713
/**

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

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

1473+
if (xdp_rxq_info_is_reg(&rx_ring->xdp_rxq))
1474+
xdp_rxq_info_unreg(&rx_ring->xdp_rxq);
1475+
14731476
if (rx_ring->xsk_pool) {
14741477
i40e_xsk_clean_rx_ring(rx_ring);
14751478
goto skip_free;
@@ -1527,8 +1530,6 @@ void i40e_clean_rx_ring(struct i40e_ring *rx_ring)
15271530
void i40e_free_rx_resources(struct i40e_ring *rx_ring)
15281531
{
15291532
i40e_clean_rx_ring(rx_ring);
1530-
if (rx_ring->vsi->type == I40E_VSI_MAIN)
1531-
xdp_rxq_info_unreg(&rx_ring->xdp_rxq);
15321533
rx_ring->xdp_prog = NULL;
15331534
kfree(rx_ring->rx_bi);
15341535
rx_ring->rx_bi = NULL;

drivers/net/ethernet/intel/ice/ice_base.c

Lines changed: 10 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -661,34 +661,22 @@ static int ice_vsi_cfg_rxq(struct ice_rx_ring *ring)
661661
{
662662
struct device *dev = ice_pf_to_dev(ring->vsi->back);
663663
u32 num_bufs = ICE_DESC_UNUSED(ring);
664-
u32 rx_buf_len;
665664
int err;
666665

667666
if (ring->vsi->type == ICE_VSI_PF || ring->vsi->type == ICE_VSI_SF ||
668667
ring->vsi->type == ICE_VSI_LB) {
669-
if (!xdp_rxq_info_is_reg(&ring->xdp_rxq)) {
670-
err = __xdp_rxq_info_reg(&ring->xdp_rxq, ring->netdev,
671-
ring->q_index,
672-
ring->q_vector->napi.napi_id,
673-
ring->rx_buf_len);
674-
if (err)
675-
return err;
676-
}
677-
678668
ice_rx_xsk_pool(ring);
679669
err = ice_realloc_rx_xdp_bufs(ring, ring->xsk_pool);
680670
if (err)
681671
return err;
682672

683673
if (ring->xsk_pool) {
684-
xdp_rxq_info_unreg(&ring->xdp_rxq);
685-
686-
rx_buf_len =
687-
xsk_pool_get_rx_frame_size(ring->xsk_pool);
674+
u32 frag_size =
675+
xsk_pool_get_rx_frag_step(ring->xsk_pool);
688676
err = __xdp_rxq_info_reg(&ring->xdp_rxq, ring->netdev,
689677
ring->q_index,
690678
ring->q_vector->napi.napi_id,
691-
rx_buf_len);
679+
frag_size);
692680
if (err)
693681
return err;
694682
err = xdp_rxq_info_reg_mem_model(&ring->xdp_rxq,
@@ -705,14 +693,13 @@ static int ice_vsi_cfg_rxq(struct ice_rx_ring *ring)
705693
if (err)
706694
return err;
707695

708-
if (!xdp_rxq_info_is_reg(&ring->xdp_rxq)) {
709-
err = __xdp_rxq_info_reg(&ring->xdp_rxq, ring->netdev,
710-
ring->q_index,
711-
ring->q_vector->napi.napi_id,
712-
ring->rx_buf_len);
713-
if (err)
714-
goto err_destroy_fq;
715-
}
696+
err = __xdp_rxq_info_reg(&ring->xdp_rxq, ring->netdev,
697+
ring->q_index,
698+
ring->q_vector->napi.napi_id,
699+
ring->truesize);
700+
if (err)
701+
goto err_destroy_fq;
702+
716703
xdp_rxq_info_attach_page_pool(&ring->xdp_rxq,
717704
ring->pp);
718705
}

drivers/net/ethernet/intel/ice/ice_ethtool.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3342,6 +3342,7 @@ ice_set_ringparam(struct net_device *netdev, struct ethtool_ringparam *ring,
33423342
rx_rings[i].cached_phctime = pf->ptp.cached_phc_time;
33433343
rx_rings[i].desc = NULL;
33443344
rx_rings[i].xdp_buf = NULL;
3345+
rx_rings[i].xdp_rxq = (struct xdp_rxq_info){ };
33453346

33463347
/* this is to allow wr32 to have something to write to
33473348
* during early allocation of Rx buffers

drivers/net/ethernet/intel/ice/ice_txrx.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -560,7 +560,9 @@ void ice_clean_rx_ring(struct ice_rx_ring *rx_ring)
560560
i = 0;
561561
}
562562

563-
if (rx_ring->vsi->type == ICE_VSI_PF &&
563+
if ((rx_ring->vsi->type == ICE_VSI_PF ||
564+
rx_ring->vsi->type == ICE_VSI_SF ||
565+
rx_ring->vsi->type == ICE_VSI_LB) &&
564566
xdp_rxq_info_is_reg(&rx_ring->xdp_rxq)) {
565567
xdp_rxq_info_detach_mem_model(&rx_ring->xdp_rxq);
566568
xdp_rxq_info_unreg(&rx_ring->xdp_rxq);

drivers/net/ethernet/intel/ice/ice_xsk.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -899,6 +899,9 @@ void ice_xsk_clean_rx_ring(struct ice_rx_ring *rx_ring)
899899
u16 ntc = rx_ring->next_to_clean;
900900
u16 ntu = rx_ring->next_to_use;
901901

902+
if (xdp_rxq_info_is_reg(&rx_ring->xdp_rxq))
903+
xdp_rxq_info_unreg(&rx_ring->xdp_rxq);
904+
902905
while (ntc != ntu) {
903906
struct xdp_buff *xdp = *ice_xdp_buf(rx_ring, ntc);
904907

drivers/net/ethernet/intel/idpf/xdp.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,16 @@ static int __idpf_xdp_rxq_info_init(struct idpf_rx_queue *rxq, void *arg)
4747
{
4848
const struct idpf_vport *vport = rxq->q_vector->vport;
4949
const struct idpf_q_vec_rsrc *rsrc;
50+
u32 frag_size = 0;
5051
bool split;
5152
int err;
5253

54+
if (idpf_queue_has(XSK, rxq))
55+
frag_size = rxq->bufq_sets[0].bufq.truesize;
56+
5357
err = __xdp_rxq_info_reg(&rxq->xdp_rxq, vport->netdev, rxq->idx,
5458
rxq->q_vector->napi.napi_id,
55-
rxq->rx_buf_size);
59+
frag_size);
5660
if (err)
5761
return err;
5862

drivers/net/ethernet/intel/idpf/xsk.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,7 @@ int idpf_xskfq_init(struct idpf_buf_queue *bufq)
403403
bufq->pending = fq.pending;
404404
bufq->thresh = fq.thresh;
405405
bufq->rx_buf_size = fq.buf_len;
406+
bufq->truesize = fq.truesize;
406407

407408
if (!idpf_xskfq_refill(bufq))
408409
netdev_err(bufq->pool->netdev,

drivers/net/ethernet/intel/libeth/xsk.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ int libeth_xskfq_create(struct libeth_xskfq *fq)
167167
fq->pending = fq->count;
168168
fq->thresh = libeth_xdp_queue_threshold(fq->count);
169169
fq->buf_len = xsk_pool_get_rx_frame_size(fq->pool);
170+
fq->truesize = xsk_pool_get_rx_frag_step(fq->pool);
170171

171172
return 0;
172173
}

0 commit comments

Comments
 (0)