On 23/04/2022 18:01, Xuan Zhuo wrote: > On Sat, 23 Apr 2022 17:58:05 +0300, Nikolay Aleksandrov <razor@xxxxxxxxxxxxx> wrote: >> On 23/04/2022 17:36, Xuan Zhuo wrote: >>> On Sat, 23 Apr 2022 17:30:11 +0300, Nikolay Aleksandrov <razor@xxxxxxxxxxxxx> wrote: >>>> On 23/04/2022 17:16, Nikolay Aleksandrov wrote: >>>>> On 23/04/2022 16:31, Xuan Zhuo wrote: >>>>>> On Sat, 23 Apr 2022 14:26:12 +0300, Nikolay Aleksandrov <razor@xxxxxxxxxxxxx> wrote: [snip] metasize, >>>>>> - VIRTIO_XDP_HEADROOM); >>>>>> + VIRTIO_XDP_HEADROOM - metazie); >>>>>> return head_skb; >>>>>> } >>>>>> break; >>>>> >>>>> That patch doesn't fix it, as I said with xdp you can move both data and data_meta. >>>>> So just doing that would take care of the meta, but won't take care of moving data. >>>>> >>>> >>>> Also it doesn't take care of the case where page_to_skb() is called with the original page >>>> i.e. when we already have headroom, so we hit the next/standard page_to_skb() call (xdp_page == page). >>> >>> Yes, you are right. >>> >>>> >>>> The above change guarantees that buf and p will be in the same page >>> >>> >>> How can this be guaranteed? >>> >>> 1. For example, we applied for a 32k buffer first, and took away 1500 + hdr_len >>> from the allocation. >>> 2. set xdp >>> 3. alloc for new buffer >>> >> >> p = page_address(page) + offset; >> buf = p & PAGE_MASK; // whatever page p lands in is where buf is set >> >> => p and buf are always in the same page, no? > > I don't think it is, it's entirely possible to split on two pages. > Ahhh, I completely misinterpreted page_address(). You're right.