On Mon, Aug 26, 2024 at 12:40:18AM +0200, Oleg Nesterov wrote:
> On 08/25, Oleg Nesterov wrote:
> >
> > At least I certainly disagree with "Fixes: c1ae5c75e103" ;)
> >
> > uretprobe_perf_func/etc was designed for perf, and afaics this code still
> > works fine even if you run 2 perf-record's with -p PID1/PID2 at the same
> > time.
> >
> > BPF hacks/hooks were added later, so perhaps this should be fixed in the
> > bpf code, but I have no idea what bpftrace does...
> 
> And I can't install bpftrace on my old Fedora 23 working laptop ;) Yes, yes,
> I know, I should upgrade it.
> 
> For the moment, please forget about ret-probes. Could you compile this program
> 
>       #define _GNU_SOURCE
>       #include <unistd.h>
>       #include <sched.h>
>       #include <signal.h>
> 
>       int func(int i)
>       {
>               return i;
>       }
> 
>       int test(void *arg)
>       {
>               int i;
>               for (i = 0;; ++i) {
>                       sleep(1);
>                       func(i);
>               }
>               return 0;
>       }
> 
>       int main(void)
>       {
>               static char stack[65536];
> 
>               clone(test, stack + sizeof(stack)/2, CLONE_VM|SIGCHLD, NULL);
>               test(NULL);
> 
>               return 0;
>       }
> 
> and then do something like
> 
>       $ ./test &
>       $ bpftrace -p $! -e 'uprobe:./test:func { printf("%d\n", pid); }'
> 
> I hope that the syntax of the 2nd command is correct...
> 
> I _think_ that it will print 2 pids too.

yes.. but with CLONE_VM both processes share 'mm' so they are threads,
and at least uprobe_multi filters by process [1] now.. ;-)

> 
> But "perf-record -p" works as expected.

I wonder it's because there's the perf layer that schedules each
uprobe event only when its process (PID1/2) is scheduled in and will
receive events only from that cpu while the process is running on it

jirka

[1] 46ba0e49b642 bpf: fix multi-uprobe PID filtering logic

> 
> Oleg.
> 

Reply via email to