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. >