Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'xsk-respect-the-offsets-when-copying-frags'

Bui Quang Minh says:

====================
xsk: respect the offsets when copying frags

In commit 560d958c6c68 ("xsk: add generic XSk &xdp_buff -> skb
conversion"), we introduce a helper to convert zerocopy xdp_buff to skb.
However, in the frag copy, we mistakenly ignore the frag's offset. This
series adds the missing offset when copying frags in
xdp_copy_frags_from_zc(). This function is not used anywhere so no
backport is needed.

This series also makes xdp_copy_frags_from_zc() use page allocation API
page_pool_dev_alloc() instead of page_pool_dev_alloc_netmem() to avoid
possible confusion of the returned value.
====================

Link: https://patch.msgid.link/20250426081220.40689-1-minhquangbui99@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+9 -8
+9 -8
net/core/xdp.c
··· 698 698 nr_frags = xinfo->nr_frags; 699 699 700 700 for (u32 i = 0; i < nr_frags; i++) { 701 - u32 len = skb_frag_size(&xinfo->frags[i]); 701 + const skb_frag_t *frag = &xinfo->frags[i]; 702 + u32 len = skb_frag_size(frag); 702 703 u32 offset, truesize = len; 703 - netmem_ref netmem; 704 + struct page *page; 704 705 705 - netmem = page_pool_dev_alloc_netmem(pp, &offset, &truesize); 706 - if (unlikely(!netmem)) { 706 + page = page_pool_dev_alloc(pp, &offset, &truesize); 707 + if (unlikely(!page)) { 707 708 sinfo->nr_frags = i; 708 709 return false; 709 710 } 710 711 711 - memcpy(__netmem_address(netmem), 712 - __netmem_address(xinfo->frags[i].netmem), 712 + memcpy(page_address(page) + offset, 713 + skb_frag_page(frag) + skb_frag_off(frag), 713 714 LARGEST_ALIGN(len)); 714 - __skb_fill_netmem_desc_noacc(sinfo, i, netmem, offset, len); 715 + __skb_fill_page_desc_noacc(sinfo, i, page, offset, len); 715 716 716 717 tsize += truesize; 717 - pfmemalloc |= netmem_is_pfmemalloc(netmem); 718 + pfmemalloc |= page_is_pfmemalloc(page); 718 719 } 719 720 720 721 xdp_update_skb_shared_info(skb, nr_frags, xinfo->xdp_frags_size,