Lorenzo Bianconi <lorenzo@xxxxxxxxxx> writes: > This series introduce XDP multi-buffer support. The mvneta driver is > the first to support these new "non-linear" xdp_{buff,frame}. Reviewers > please focus on how these new types of xdp_{buff,frame} packets > traverse the different layers and the layout design. It is on purpose > that BPF-helpers are kept simple, as we don't want to expose the > internal layout to allow later changes. > > The main idea for the new multi-buffer layout is to reuse the same > structure used for non-linear SKB. This rely on the "skb_shared_info" > struct at the end of the first buffer to link together subsequent > buffers. Keeping the layout compatible with SKBs is also done to ease > and speedup creating a SKB from an xdp_{buff,frame}. > Converting xdp_frame to SKB and deliver it to the network stack is shown > in patch 05/18 (e.g. cpumaps). > > A multi-buffer bit (mb) has been introduced in the flags field of xdp_{buff,frame} > structure to notify the bpf/network layer if this is a xdp multi-buffer frame > (mb = 1) or not (mb = 0). > The mb bit will be set by a xdp multi-buffer capable driver only for > non-linear frames maintaining the capability to receive linear frames > without any extra cost since the skb_shared_info structure at the end > of the first buffer will be initialized only if mb is set. > Moreover the flags field in xdp_{buff,frame} will be reused even for > xdp rx csum offloading in future series. > > Typical use cases for this series are: > - Jumbo-frames > - Packet header split (please see Google’s use-case @ NetDevConf 0x14, [0]) > - TSO/GRO for XDP_REDIRECT > > The three following ebpf helpers (and related selftests) has been introduced: > - bpf_xdp_load_bytes: > This helper is provided as an easy way to load data from a xdp buffer. It > can be used to load len bytes from offset from the frame associated to > xdp_md, into the buffer pointed by buf. > - bpf_xdp_store_bytes: > Store len bytes from buffer buf into the frame associated to xdp_md, at > offset. > - bpf_xdp_get_buff_len: > Return the total frame size (linear + paged parts) > > bpf_xdp_adjust_tail and bpf_xdp_copy helpers have been modified to take into > account xdp multi-buff frames. > Moreover, similar to skb_header_pointer, we introduced bpf_xdp_pointer utility > routine to return a pointer to a given position in the xdp_buff if the > requested area (offset + len) is contained in a contiguous memory area > otherwise it must be copied in a bounce buffer provided by the caller running > bpf_xdp_copy_buf(). > > BPF_F_XDP_MB flag for bpf_attr has been introduced to notify the kernel the > eBPF program fully support xdp multi-buffer. > SEC("xdp_mb/"), SEC_DEF("xdp_devmap_mb/") and SEC_DEF("xdp_cpumap_mb/" have been > introduced to declare xdp multi-buffer support. > The NIC driver is expected to reject an eBPF program if it is running in XDP > multi-buffer mode and the program does not support XDP multi-buffer. > In the same way it is not possible to mix xdp multi-buffer and xdp legacy > programs in a CPUMAP/DEVMAP or tailcall a xdp multi-buffer/legacy program from > a legacy/multi-buff one. > > More info about the main idea behind this approach can be found here > [1][2]. Great to see this converging; as John said, thanks for sticking with it! Nice round number on the series version as well ;) For the series: Acked-by: Toke Høiland-Jørgensen <toke@xxxxxxxxxx>