On Tue, Dec 06, 2016 at 09:35:31AM -0800, John Fastabend wrote: > On 16-12-03 07:17 PM, Martin KaFai Lau wrote: > > This patch allows XDP prog to extend/remove the packet > > data at the head (like adding or removing header). It is > > done by adding a new XDP helper bpf_xdp_adjust_head(). > > > > It also renames bpf_helper_changes_skb_data() to > > bpf_helper_changes_pkt_data() to better reflect > > that XDP prog does not work on skb. > > > > Acked-by: Alexei Starovoitov <a...@kernel.org> > > Signed-off-by: Martin KaFai Lau <ka...@fb.com> > > --- > > > [...] > > > > > -bool bpf_helper_changes_skb_data(void *func) > > +BPF_CALL_2(bpf_xdp_adjust_head, struct xdp_buff *, xdp, int, offset) > > +{ > > + /* Both mlx4 and mlx5 driver align each packet to PAGE_SIZE when > > + * XDP prog is set. > > + * If the above is not true for the other drivers to support > > + * bpf_xdp_adjust_head, struct xdp_buff can be extended. > > + */ > > + unsigned long addr = (unsigned long)xdp->data & PAGE_MASK; > > + void *data_hard_start = (void *)addr; > > + void *data = xdp->data + offset; > > + > > + if (unlikely(data < data_hard_start || data > xdp->data_end - ETH_HLEN)) > > + return -EINVAL; > > + > > + xdp->data = data; > > + > > + return 0; > > +} > > + > > Sorry for the delay but I don't like the assumptions being made here > with regards to page alignment and free space. > > Instead of taking the offset from PAGE_MASK how about adding a pointer > to xdp_buff so that we get, > > struct xdp_buff { > void *data; > void *data_end; > void *data_start; > }; > > This gives the headroom explicitly in the data structure. This way we > can handle non-paged aligned usages and also some of the drivers are > putting metadata (descriptors) at the front of the page. With this > patch we could stomp on that metadata with the above we avoid that > problem altogether. Extending the xdp_buff like this was my first local attempt. And then I realized the assumption that mlx4/5 is making. Since there is no immediate need for this patch series and the xdp_buff can always be extended later if needed without breaking the xdp prog, I dropped the xdp_buff addition for now in this patch.
Sure, it will be done at the next spin.