On Fri, Nov 4, 2022 at 1:22 AM Björn Töpel <bjorn@xxxxxxxxxx> wrote: > > Stanislav Fomichev <sdf@xxxxxxxxxx> writes: > > > While working on a simplified test for [0] it occurred to me that > > the following looks fishy: > > > > data = xsk_umem__get_data(xsk->umem_area, rx_desc->addr); > > data_meta = data - sizeof(my metadata); > > > > Since the data points to umem frame at addr X, data_mem points to > > the end of umem frame X-1. > > > > I don't think it's by design? > > It is by design. :-) Noted, thanks for clarifying! > > diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c > > index 9f0561b67c12..0547fe37ba7e 100644 > > --- a/net/xdp/xsk.c > > +++ b/net/xdp/xsk.c > > @@ -163,7 +163,7 @@ static void xsk_copy_xdp(struct xdp_buff *to, struct xdp_buff *from, u32 len) > > } else { > > from_buf = from->data_meta; > > metalen = from->data - from->data_meta; > > - to_buf = to->data - metalen; > > This is to include the XDP meta data in the receive buffer. Note that > AF_XDP descriptor that you get back on the RX ring points to the *data* > not the metadata. > > For the unaligned mode you can pass any address (umem offset) into the > fill ring, and the kernel will simply mask it and setup headroom > accordingly. Thanks for the details! And what happens in the aligned case? Looking purely from the user side: tx_desc = xsk_ring_prod__tx_desc(&xsk->tx, idx); tx_desc->addr = idx * UMEM_FRAME_SIZE; /* this has to be aligned to the frame size? */ data = xsk_umem__get_data(xsk->umem_area, tx_desc->addr); data here is basically = umem_area + idx * UMEM_FRAM_SIZE, right? How do I make sure metadata is placed in the same umem chunk? Will passing umem headroom do the trick? > The buffer allocator guarantees that there's XDP_PACKET_HEADROOM > available. > > IOW your example userland code above is correct. > > > Björn > >