Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

selftests/bpf: Fix uprobe consumer test

With newly merged code the uprobe behaviour is slightly different
and affects uprobe consumer test.

We no longer need to check if the uprobe object is still preserved
after removing last uretprobe, because it stays as long as there's
pending/installed uretprobe instance.

This allows to run uretprobe consumers registered 'after' uprobe was
hit even if previous uretprobe got unregistered before being hit.

The uprobe object will be now removed after the last uprobe ref is
released and in such case it's held by ri->uprobe (return instance)
which is released after the uretprobe is hit.

Reported-by: Ihor Solodrai <ihor.solodrai@pm.me>
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Tested-by: Ihor Solodrai <ihor.solodrai@pm.me>
Closes: https://lore.kernel.org/bpf/w6U8Z9fdhjnkSp2UaFaV1fGqJXvfLEtDKEUyGDkwmoruDJ_AgF_c0FFhrkeKW18OqiP-05s9yDKiT6X-Ns-avN_ABf0dcUkXqbSJN1TQSXo=@pm.me/
Signed-off-by: Alexei Starovoitov <ast@kernel.org>

authored by

Jiri Olsa and committed by
Alexei Starovoitov
4b7c0559 fd4a0e67

+1 -8
+1 -8
tools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c
··· 869 869 fmt = "prog 0/1: uprobe"; 870 870 } else { 871 871 /* 872 - * uprobe return is tricky ;-) 873 - * 874 872 * to trigger uretprobe consumer, the uretprobe needs to be installed, 875 873 * which means one of the 'return' uprobes was alive when probe was hit: 876 874 * 877 875 * idxs: 2/3 uprobe return in 'installed' mask 878 - * 879 - * in addition if 'after' state removes everything that was installed in 880 - * 'before' state, then uprobe kernel object goes away and return uprobe 881 - * is not installed and we won't hit it even if it's in 'after' state. 882 876 */ 883 877 unsigned long had_uretprobes = before & 0b1100; /* is uretprobe installed */ 884 - unsigned long probe_preserved = before & after; /* did uprobe go away */ 885 878 886 - if (had_uretprobes && probe_preserved && test_bit(idx, after)) 879 + if (had_uretprobes && test_bit(idx, after)) 887 880 val++; 888 881 fmt = "idx 2/3: uretprobe"; 889 882 }