From: "Toke Høiland-Jørgensen" <toke@redhat.com>
To: Lorenzo Bianconi <lorenzo@kernel.org>,
Jesper Dangaard Brouer <brouer@redhat.com>
Cc: Tariq Toukan <ttoukan.linux@gmail.com>,
Daniel Borkmann <borkmann@iogearbox.net>,
Alexei Starovoitov <ast@kernel.org>,
Andrii Nakryiko <andrii.nakryiko@gmail.com>,
bpf@vger.kernel.org, Tariq Toukan <tariqt@nvidia.com>,
gal@nvidia.com, netdev@vger.kernel.org, echaudro@redhat.com,
andrew.gospodarek@broadcom.com
Subject: Re: [PATCH bpf-next] bpf/xdp: optimize bpf_xdp_pointer to avoid reading sinfo
Date: Wed, 31 May 2023 18:24:52 +0200 [thread overview]
Message-ID: <87353ceaej.fsf@toke.dk> (raw)
In-Reply-To: <ZHdrLSDC7UfLKKfp@lore-desk>
Lorenzo Bianconi <lorenzo@kernel.org> writes:
>> Currently we observed a significant performance degradation in
>> samples/bpf xdp1 and xdp2, due XDP multibuffer "xdp.frags" handling,
>> added in commit 772251742262 ("samples/bpf: fixup some tools to be able
>> to support xdp multibuffer").
>>
>> This patch reduce the overhead by avoiding to read/load shared_info
>> (sinfo) memory area, when XDP packet don't have any frags. This improves
>> performance because sinfo is located in another cacheline.
>>
>> Function bpf_xdp_pointer() is used by BPF helpers bpf_xdp_load_bytes()
>> and bpf_xdp_store_bytes(). As a help to reviewers, xdp_get_buff_len() can
>> potentially access sinfo.
>>
>> Perf report show bpf_xdp_pointer() percentage utilization being reduced
>> from 4,19% to 3,37% (on CPU E5-1650 @3.60GHz).
>>
>> The BPF kfunc bpf_dynptr_slice() also use bpf_xdp_pointer(). Thus, it
>> should also take effect for that.
>>
>> Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
>> ---
>> net/core/filter.c | 12 ++++++++----
>> 1 file changed, 8 insertions(+), 4 deletions(-)
>>
>> diff --git a/net/core/filter.c b/net/core/filter.c
>> index 968139f4a1ac..a635f537d499 100644
>> --- a/net/core/filter.c
>> +++ b/net/core/filter.c
>> @@ -3948,20 +3948,24 @@ void bpf_xdp_copy_buf(struct xdp_buff *xdp, unsigned long off,
>>
>> void *bpf_xdp_pointer(struct xdp_buff *xdp, u32 offset, u32 len)
>> {
>> - struct skb_shared_info *sinfo = xdp_get_shared_info_from_buff(xdp);
>> u32 size = xdp->data_end - xdp->data;
>> + struct skb_shared_info *sinfo;
>> void *addr = xdp->data;
>> int i;
>>
>> if (unlikely(offset > 0xffff || len > 0xffff))
>> return ERR_PTR(-EFAULT);
>>
>> - if (offset + len > xdp_get_buff_len(xdp))
>> - return ERR_PTR(-EINVAL);
>> + if (likely((offset < size))) /* linear area */
>> + goto out;
>
> Hi Jesper,
>
> please correct me if I am wrong but looking at the code, in this way
> bpf_xdp_pointer() will return NULL (and not ERR_PTR(-EINVAL)) if:
> - offset < size
> - offset + len > xdp_get_buff_len()
>
> doing so I would say bpf_xdp_copy_buf() will copy the full packet starting from
> offset leaving some part of the auxiliary buffer possible uninitialized.
> Do you think it is an issue?
Yeah, you're right, bpf_xdp_load_bytes() should fail if trying to read
beyond the frame, and in this case it won't for non-frags; that's a
change in behaviour we probably shouldn't be making...
-Toke
next prev parent reply other threads:[~2023-05-31 16:25 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-31 14:52 [PATCH bpf-next] bpf/xdp: optimize bpf_xdp_pointer to avoid reading sinfo Jesper Dangaard Brouer
2023-05-31 15:43 ` Lorenzo Bianconi
2023-05-31 16:24 ` Toke Høiland-Jørgensen [this message]
2023-05-31 17:54 ` Jesper Dangaard Brouer
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=87353ceaej.fsf@toke.dk \
--to=toke@redhat.com \
--cc=andrew.gospodarek@broadcom.com \
--cc=andrii.nakryiko@gmail.com \
--cc=ast@kernel.org \
--cc=borkmann@iogearbox.net \
--cc=bpf@vger.kernel.org \
--cc=brouer@redhat.com \
--cc=echaudro@redhat.com \
--cc=gal@nvidia.com \
--cc=lorenzo@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=tariqt@nvidia.com \
--cc=ttoukan.linux@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.