Skip to content

Commit d5c8ffa

Browse files
olsajirigregkh
authored andcommitted
selftests/bpf: Fix uprobe consumer test
commit 4b7c055 upstream. 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 <[email protected]> Signed-off-by: Jiri Olsa <[email protected]> Signed-off-by: Daniel Borkmann <[email protected]> Tested-by: Ihor Solodrai <[email protected]> Closes: https://lore.kernel.org/bpf/w6U8Z9fdhjnkSp2UaFaV1fGqJXvfLEtDKEUyGDkwmoruDJ_AgF_c0FFhrkeKW18OqiP-05s9yDKiT6X-Ns-avN_ABf0dcUkXqbSJN1TQSXo=@pm.me/ Signed-off-by: Alexei Starovoitov <[email protected]> Cc: Alan Maguire <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 449dd20 commit d5c8ffa

File tree

1 file changed

+1
-8
lines changed

1 file changed

+1
-8
lines changed

tools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -869,21 +869,14 @@ static void consumer_test(struct uprobe_multi_consumers *skel,
869869
fmt = "prog 0/1: uprobe";
870870
} else {
871871
/*
872-
* uprobe return is tricky ;-)
873-
*
874872
* to trigger uretprobe consumer, the uretprobe needs to be installed,
875873
* which means one of the 'return' uprobes was alive when probe was hit:
876874
*
877875
* 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.
882876
*/
883877
unsigned long had_uretprobes = before & 0b1100; /* is uretprobe installed */
884-
unsigned long probe_preserved = before & after; /* did uprobe go away */
885878

886-
if (had_uretprobes && probe_preserved && test_bit(idx, after))
879+
if (had_uretprobes && test_bit(idx, after))
887880
val++;
888881
fmt = "idx 2/3: uretprobe";
889882
}

0 commit comments

Comments
 (0)