From: Jiri Olsa <olsajiri@gmail.com>
To: Andrew Werner <awerner32@gmail.com>
Cc: bpf@vger.kernel.org, kernel-team@dataexmachina.dev,
Andrii Nakryiko <andrii@kernel.org>
Subject: Re: [PATCH bpf-next v2] libbpf: handle producer position overflow
Date: Thu, 27 Jul 2023 10:33:28 +0200 [thread overview]
Message-ID: <ZMIr2GbRcvihtidX@krava> (raw)
In-Reply-To: <20230724132543.1282645-1-awerner32@gmail.com>
On Mon, Jul 24, 2023 at 09:25:45AM -0400, Andrew Werner wrote:
> Before this patch, the producer position could overflow `unsigned
> long`, in which case libbpf would forever stop processing new writes to
> the ringbuf. This patch addresses that bug by avoiding ordered
> comparison between the consumer and producer position. If the consumer
> position is greater than the producer position, the assumption is that
> the producer has overflowed.
>
> A more defensive check could be to ensure that the delta is within
> the allowed range, but such defensive checks are neither present in
> the kernel side code nor in libbpf. The overflow that this patch
> handles can occur while the producer and consumer follow a correct
> protocol.
>
> A selftest was written to demonstrate the bug, and indeed this patch
> allows the test to continue to make progress past the overflow.
> However, the author was unable to create a testing environment on a
> 32-bit machine, and the test requires substantial memory and over 4
> hours to hit the overflow point on a 64-bit machine. Thus, the test
> is not included in this patch because of the impracticality of running
> it.
>
> Additionally, this patch adds commentary around a separate point to note
> that the modular arithmetic is valid in the face of overflows, as that
> fact may not be obvious to future readers.
>
> v1->v2:
> - Fixed comment grammar.
> - Properly formatted subject line.
>
> Reference:
> [v1]: https://lore.kernel.org/bpf/20230724132404.1280848-1-awerner32@gmail.com/T/#u
>
> Signed-off-by: Andrew Werner <awerner32@gmail.com>
> ---
> tools/lib/bpf/ringbuf.c | 11 ++++++++++-
> 1 file changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/tools/lib/bpf/ringbuf.c b/tools/lib/bpf/ringbuf.c
> index 02199364db13..2055f3099843 100644
> --- a/tools/lib/bpf/ringbuf.c
> +++ b/tools/lib/bpf/ringbuf.c
> @@ -237,7 +237,11 @@ static int64_t ringbuf_process_ring(struct ring *r)
> do {
> got_new_data = false;
> prod_pos = smp_load_acquire(r->producer_pos);
> - while (cons_pos < prod_pos) {
> +
> + /* Avoid signed comparisons between the positions; the producer
> + * position can overflow before the consumer position.
> + */
> + while (cons_pos != prod_pos) {
> len_ptr = r->data + (cons_pos & r->mask);
> len = smp_load_acquire(len_ptr);
>
> @@ -498,6 +502,11 @@ void *user_ring_buffer__reserve(struct user_ring_buffer *rb, __u32 size)
> prod_pos = smp_load_acquire(rb->producer_pos);
>
> max_size = rb->mask + 1;
> +
> + /* Note that this formulation is valid in the face of overflow of
> + * prod_pos so long as the delta between prod_pos and cons_pos is
> + * no greater than max_size.
> + */
> avail_size = max_size - (prod_pos - cons_pos);
hi,
the above hunk handles the case for 'prod_pos < cons_pos',
but it looks like we assume 'cons_pos < prod_pos' in above calculation,
should we check on that?
jirka
> /* Round up total size to a multiple of 8. */
> total_size = (size + BPF_RINGBUF_HDR_SZ + 7) / 8 * 8;
> --
> 2.39.2
>
>
next prev parent reply other threads:[~2023-07-27 8:34 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-24 13:25 [PATCH bpf-next v2] libbpf: handle producer position overflow Andrew Werner
2023-07-27 2:14 ` Hou Tao
2023-07-27 8:33 ` Jiri Olsa [this message]
2023-07-27 14:45 ` Andrew Werner
2023-08-03 3:41 ` Alexei Starovoitov
2023-08-03 13:58 ` Andrew Werner
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=ZMIr2GbRcvihtidX@krava \
--to=olsajiri@gmail.com \
--cc=andrii@kernel.org \
--cc=awerner32@gmail.com \
--cc=bpf@vger.kernel.org \
--cc=kernel-team@dataexmachina.dev \
/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.