From: Jiri Olsa <olsajiri@gmail.com>
To: Oleg Nesterov <oleg@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>,
Alexei Starovoitov <ast@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
Andrii Nakryiko <andrii@kernel.org>,
bpf@vger.kernel.org, Martin KaFai Lau <kafai@fb.com>,
Song Liu <songliubraving@fb.com>, Yonghong Song <yhs@fb.com>,
John Fastabend <john.fastabend@gmail.com>,
KP Singh <kpsingh@chromium.org>,
Stanislav Fomichev <sdf@google.com>, Hao Luo <haoluo@google.com>,
Steven Rostedt <rostedt@goodmis.org>,
Masami Hiramatsu <mhiramat@kernel.org>,
linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org
Subject: Re: [PATCHv3 1/7] uprobe: Add support for session consumer
Date: Fri, 13 Sep 2024 10:22:56 +0200 [thread overview]
Message-ID: <ZuP2YFruQDXTRi25@krava> (raw)
In-Reply-To: <20240912162028.GD27648@redhat.com>
On Thu, Sep 12, 2024 at 06:20:29PM +0200, Oleg Nesterov wrote:
> On 09/09, Jiri Olsa wrote:
> >
> > static void handler_chain(struct uprobe *uprobe, struct pt_regs *regs)
> > {
> > struct uprobe_consumer *uc;
> > int remove = UPROBE_HANDLER_REMOVE;
> > - bool need_prep = false; /* prepare return uprobe, when needed */
> > + struct return_consumer *ric = NULL;
> > + struct return_instance *ri = NULL;
> > bool has_consumers = false;
> >
> > current->utask->auprobe = &uprobe->arch;
> >
> > list_for_each_entry_srcu(uc, &uprobe->consumers, cons_node,
> > srcu_read_lock_held(&uprobes_srcu)) {
> > + __u64 cookie = 0;
> > int rc = 0;
> >
> > if (uc->handler) {
> > - rc = uc->handler(uc, regs);
> > - WARN(rc & ~UPROBE_HANDLER_MASK,
> > + rc = uc->handler(uc, regs, &cookie);
> > + WARN(rc < 0 || rc > 2,
> > "bad rc=0x%x from %ps()\n", rc, uc->handler);
> > }
> >
> > - if (uc->ret_handler)
> > - need_prep = true;
> > -
> > + /*
> > + * The handler can return following values:
> > + * 0 - execute ret_handler (if it's defined)
> > + * 1 - remove uprobe
> > + * 2 - do nothing (ignore ret_handler)
> > + */
> > remove &= rc;
> > has_consumers = true;
> > +
> > + if (rc == 0 && uc->ret_handler) {
>
> should we enter this block if uc->handler == NULL?
yes, consumer can have just ret_handler defined
>
> > + /*
> > + * Preallocate return_instance object optimistically with
> > + * all possible consumers, so we allocate just once.
> > + */
> > + if (!ri) {
> > + ri = alloc_return_instance(uprobe->consumers_cnt);
>
> This doesn't look right...
>
> Suppose we have a single consumer C1, so uprobe->consumers_cnt == 1 and
> alloc_return_instance() allocates return_instance with for a single consumer,
> so that only ri->consumers[0] is valid.
>
> Right after that uprobe_register()->consumer_add() adds another consumer
> C2 with ->ret_handler != NULL.
>
> On the next iteration return_consumer_next() will return the invalid addr
> == &ri->consumers[1].
>
> perhaps this needs krealloc() ?
damn.. there used to be a lock ;-) ok, for some reason I thought we are safe
in that list iteration and we are not.. I just made selftest that triggers that
I'm not sure the realloc will help, I feel like we need to allocate return
consumer for each called handler separately to be safe
>
> > + if (!ri)
> > + return;
>
> Not sure we should simply return if kzalloc fails... at least it would be better
> to clear current->utask->auprobe.
>
> > + if (ri && !remove)
> > + prepare_uretprobe(uprobe, regs, ri); /* put bp at return */
> > + else
> > + kfree(ri);
>
> Well, if ri != NULL then remove is not possible, afaics... ri != NULL means
> that at least one ->handler() returned rc = 0, thus "remove" must be zero.
>
> So it seems you can just do
>
> if (ri)
> prepare_uretprobe(...);
true, I think that should be enough
thanks,
jirka
>
>
> Didn't read other parts of your patch yet ;)
>
> Oleg.
>
next prev parent reply other threads:[~2024-09-13 8:23 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-09 7:45 [PATCHv3 0/7] uprobe, bpf: Add session support Jiri Olsa
2024-09-09 7:45 ` [PATCHv3 1/7] uprobe: Add support for session consumer Jiri Olsa
2024-09-09 23:44 ` Andrii Nakryiko
2024-09-10 7:17 ` Jiri Olsa
2024-09-10 14:10 ` Masami Hiramatsu
2024-09-11 11:48 ` Jiri Olsa
2024-09-12 16:20 ` Oleg Nesterov
2024-09-13 8:22 ` Jiri Olsa [this message]
2024-09-13 10:07 ` Oleg Nesterov
2024-09-13 10:57 ` Oleg Nesterov
2024-09-13 11:34 ` Jiri Olsa
2024-09-13 11:41 ` Oleg Nesterov
2024-09-12 16:35 ` Oleg Nesterov
2024-09-13 8:36 ` Jiri Olsa
2024-09-13 9:32 ` Oleg Nesterov
2024-09-13 10:17 ` Jiri Olsa
2024-09-13 11:52 ` Oleg Nesterov
2024-09-09 7:45 ` [PATCHv3 2/7] bpf: Add support for uprobe multi session attach Jiri Olsa
2024-09-09 23:44 ` Andrii Nakryiko
2024-09-10 7:17 ` Jiri Olsa
2024-09-10 18:09 ` Andrii Nakryiko
2024-09-09 7:45 ` [PATCHv3 3/7] bpf: Add support for uprobe multi session context Jiri Olsa
2024-09-09 7:45 ` [PATCHv3 4/7] libbpf: Add support for uprobe multi session attach Jiri Olsa
2024-09-09 23:44 ` Andrii Nakryiko
2024-09-10 7:17 ` Jiri Olsa
2024-09-09 7:45 ` [PATCHv3 5/7] selftests/bpf: Add uprobe session test Jiri Olsa
2024-09-09 23:45 ` Andrii Nakryiko
2024-09-10 7:17 ` Jiri Olsa
2024-09-09 7:45 ` [PATCHv3 6/7] selftests/bpf: Add uprobe session cookie test Jiri Olsa
2024-09-09 7:45 ` [PATCHv3 7/7] selftests/bpf: Add uprobe session recursive test Jiri Olsa
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=ZuP2YFruQDXTRi25@krava \
--to=olsajiri@gmail.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=haoluo@google.com \
--cc=john.fastabend@gmail.com \
--cc=kafai@fb.com \
--cc=kpsingh@chromium.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=mhiramat@kernel.org \
--cc=oleg@redhat.com \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=sdf@google.com \
--cc=songliubraving@fb.com \
--cc=yhs@fb.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.