From: "Toke Høiland-Jørgensen" <toke@redhat•com>
To: Lorenzo Bianconi <lorenzo@kernel•org>,
bpf@vger•kernel.org, netdev@vger•kernel.org
Cc: lorenzo.bianconi@redhat•com, davem@davemloft•net,
kuba@kernel•org, ast@kernel•org, daniel@iogearbox•net,
shayagr@amazon•com, john.fastabend@gmail•com, dsahern@kernel•org,
brouer@redhat•com, echaudro@redhat•com, jasowang@redhat•com,
alexander.duyck@gmail•com, saeed@kernel•org,
maciej.fijalkowski@intel•com, magnus.karlsson@intel•com,
tirthendu.sarkar@intel•com
Subject: Re: [PATCH v11 bpf-next 17/18] net: xdp: introduce bpf_xdp_adjust_data helper
Date: Wed, 18 Aug 2021 14:31:07 +0200 [thread overview]
Message-ID: <87czqbq6ic.fsf@toke.dk> (raw)
In-Reply-To: <9696df8ef1cf6c931ae788f40a42b9278c87700b.1628854454.git.lorenzo@kernel.org>
Lorenzo Bianconi <lorenzo@kernel•org> writes:
> For XDP frames split over multiple buffers, the xdp_md->data and
> xdp_md->data_end pointers will point to the start and end of the first
> fragment only. bpf_xdp_adjust_data can be used to access subsequent
> fragments by moving the data pointers. To use, an XDP program can call
> this helper with the byte offset of the packet payload that
> it wants to access; the helper will move xdp_md->data and xdp_md ->data_end
> so they point to the requested payload offset and to the end of the
> fragment containing this byte offset, and return the byte offset of the
> start of the fragment.
> To move back to the beginning of the packet, simply call the
> helper with an offset of '0'.
> Note also that the helpers that modify the packet boundaries
> (bpf_xdp_adjust_head(), bpf_xdp_adjust_tail() and
> bpf_xdp_adjust_meta()) will fail if the pointers have been
> moved; it is the responsibility of the BPF program to move them
> back before using these helpers.
>
> Suggested-by: John Fastabend <john.fastabend@gmail•com>
> Signed-off-by: Lorenzo Bianconi <lorenzo@kernel•org>
> ---
> include/net/xdp.h | 8 +++++
> include/uapi/linux/bpf.h | 32 ++++++++++++++++++
> net/bpf/test_run.c | 8 +++++
> net/core/filter.c | 61 +++++++++++++++++++++++++++++++++-
> tools/include/uapi/linux/bpf.h | 32 ++++++++++++++++++
> 5 files changed, 140 insertions(+), 1 deletion(-)
>
> diff --git a/include/net/xdp.h b/include/net/xdp.h
> index cdaecf8d4d61..ce4764c7cd40 100644
> --- a/include/net/xdp.h
> +++ b/include/net/xdp.h
> @@ -82,6 +82,11 @@ struct xdp_buff {
> struct xdp_txq_info *txq;
> u32 frame_sz; /* frame size to deduce data_hard_end/reserved tailroom*/
> u16 flags; /* supported values defined in xdp_flags */
> + /* xdp multi-buff metadata used for frags iteration */
> + struct {
> + u16 headroom; /* frame headroom: data - data_hard_start */
> + u16 headlen; /* first buffer length: data_end - data */
> + } mb;
> };
>
> static __always_inline bool xdp_buff_is_mb(struct xdp_buff *xdp)
> @@ -127,6 +132,9 @@ xdp_prepare_buff(struct xdp_buff *xdp, unsigned char *hard_start,
> xdp->data = data;
> xdp->data_end = data + data_len;
> xdp->data_meta = meta_valid ? data : data + 1;
> + /* mb metadata for frags iteration */
> + xdp->mb.headroom = headroom;
> + xdp->mb.headlen = data_len;
> }
>
> /* Reserve memory area at end-of data area.
> diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
> index ddbf9ccc2f74..c20a8b7c5c7c 100644
> --- a/include/uapi/linux/bpf.h
> +++ b/include/uapi/linux/bpf.h
> @@ -4853,6 +4853,37 @@ union bpf_attr {
> * Get the total size of a given xdp buff (linear and paged area)
> * Return
> * The total size of a given xdp buffer.
> + *
> + * long bpf_xdp_adjust_data(struct xdp_buff *xdp_md, u32 offset)
> + * Description
> + * For XDP frames split over multiple buffers, the
> + * *xdp_md*\ **->data** and*xdp_md *\ **->data_end** pointers
> + * will point to the start and end of the first fragment only.
> + * This helper can be used to access subsequent fragments by
> + * moving the data pointers. To use, an XDP program can call
> + * this helper with the byte offset of the packet payload that
> + * it wants to access; the helper will move *xdp_md*\ **->data**
> + * and *xdp_md *\ **->data_end** so they point to the requested
> + * payload offset and to the end of the fragment containing this
> + * byte offset, and return the byte offset of the start of the
> + * fragment.
This comment is wrong now :)
-Toke
next prev parent reply other threads:[~2021-08-18 12:31 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-13 11:47 [PATCH v11 bpf-next 00/18] mvneta: introduce XDP multi-buffer support Lorenzo Bianconi
2021-08-13 11:47 ` [PATCH v11 bpf-next 01/18] net: skbuff: add size metadata to skb_shared_info for xdp Lorenzo Bianconi
2021-08-13 11:47 ` [PATCH v11 bpf-next 02/18] xdp: introduce flags field in xdp_buff/xdp_frame Lorenzo Bianconi
2021-08-13 11:47 ` [PATCH v11 bpf-next 03/18] net: mvneta: update mb bit before passing the xdp buffer to eBPF layer Lorenzo Bianconi
2021-08-13 11:47 ` [PATCH v11 bpf-next 04/18] net: mvneta: simplify mvneta_swbm_add_rx_fragment management Lorenzo Bianconi
2021-08-13 11:47 ` [PATCH v11 bpf-next 05/18] net: xdp: add xdp_update_skb_shared_info utility routine Lorenzo Bianconi
2021-08-13 11:47 ` [PATCH v11 bpf-next 06/18] net: marvell: rely on " Lorenzo Bianconi
2021-08-13 11:47 ` [PATCH v11 bpf-next 07/18] xdp: add multi-buff support to xdp_return_{buff/frame} Lorenzo Bianconi
2021-08-13 11:47 ` [PATCH v11 bpf-next 08/18] net: mvneta: add multi buffer support to XDP_TX Lorenzo Bianconi
2021-08-13 11:47 ` [PATCH v11 bpf-next 09/18] net: mvneta: enable jumbo frames for XDP Lorenzo Bianconi
2021-08-13 11:47 ` [PATCH v11 bpf-next 10/18] bpf: add multi-buff support to the bpf_xdp_adjust_tail() API Lorenzo Bianconi
2021-08-13 11:47 ` [PATCH v11 bpf-next 11/18] bpf: introduce bpf_xdp_get_buff_len helper Lorenzo Bianconi
2021-08-13 15:18 ` kernel test robot
2021-08-13 15:18 ` [RFC PATCH] bpf: bpf_xdp_get_buff_len_proto can be static kernel test robot
2021-08-13 11:47 ` [PATCH v11 bpf-next 12/18] bpf: add multi-buffer support to xdp copy helpers Lorenzo Bianconi
2021-08-13 11:47 ` [PATCH v11 bpf-next 13/18] bpf: move user_size out of bpf_test_init Lorenzo Bianconi
2021-08-13 11:47 ` [PATCH v11 bpf-next 14/18] bpf: introduce multibuff support to bpf_prog_test_run_xdp() Lorenzo Bianconi
2021-08-13 11:47 ` [PATCH v11 bpf-next 15/18] bpf: test_run: add xdp_shared_info pointer in bpf_test_finish signature Lorenzo Bianconi
2021-08-13 11:47 ` [PATCH v11 bpf-next 16/18] bpf: update xdp_adjust_tail selftest to include multi-buffer Lorenzo Bianconi
2021-08-13 11:47 ` [PATCH v11 bpf-next 17/18] net: xdp: introduce bpf_xdp_adjust_data helper Lorenzo Bianconi
2021-08-18 12:31 ` Toke Høiland-Jørgensen [this message]
2021-08-18 12:47 ` Lorenzo Bianconi
2021-08-18 12:58 ` Toke Høiland-Jørgensen
2021-08-18 13:37 ` Lorenzo Bianconi
2021-08-13 11:47 ` [PATCH v11 bpf-next 18/18] bpf: add bpf_xdp_adjust_data selftest Lorenzo Bianconi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87czqbq6ic.fsf@toke.dk \
--to=toke@redhat$(echo .)com \
--cc=alexander.duyck@gmail$(echo .)com \
--cc=ast@kernel$(echo .)org \
--cc=bpf@vger$(echo .)kernel.org \
--cc=brouer@redhat$(echo .)com \
--cc=daniel@iogearbox$(echo .)net \
--cc=davem@davemloft$(echo .)net \
--cc=dsahern@kernel$(echo .)org \
--cc=echaudro@redhat$(echo .)com \
--cc=jasowang@redhat$(echo .)com \
--cc=john.fastabend@gmail$(echo .)com \
--cc=kuba@kernel$(echo .)org \
--cc=lorenzo.bianconi@redhat$(echo .)com \
--cc=lorenzo@kernel$(echo .)org \
--cc=maciej.fijalkowski@intel$(echo .)com \
--cc=magnus.karlsson@intel$(echo .)com \
--cc=netdev@vger$(echo .)kernel.org \
--cc=saeed@kernel$(echo .)org \
--cc=shayagr@amazon$(echo .)com \
--cc=tirthendu.sarkar@intel$(echo .)com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox