Adding uprobe session consumers to the consumer test,
so we get the session into the test mix.

In addition scaling down the test to have just 1 uprobe
and 1 uretprobe, otherwise the test time grows and is
unsuitable for CI even with threads.

Signed-off-by: Jiri Olsa <[email protected]>
---
 .../bpf/prog_tests/uprobe_multi_test.c        | 68 +++++++++++++------
 .../bpf/progs/uprobe_multi_consumers.c        |  6 +-
 2 files changed, 52 insertions(+), 22 deletions(-)

diff --git a/tools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c 
b/tools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c
index 7e0228f8fcfc..e96b153a0f5d 100644
--- a/tools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c
+++ b/tools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c
@@ -799,10 +799,13 @@ static int uprobe_attach(struct uprobe_multi_consumers 
*skel, int idx)
                return -1;
 
        /*
-        * bit/prog: 0,1 uprobe entry
-        * bit/prog: 2,3 uprobe return
+        * bit/prog: 0 uprobe entry
+        * bit/prog: 1 uprobe return
+        * bit/prog: 2 uprobe session without return
+        * bit/prog: 3 uprobe session with return
         */
-       opts.retprobe = idx == 2 || idx == 3;
+       opts.retprobe = idx == 1;
+       opts.session  = idx == 2 || idx == 3;
 
        *link = bpf_program__attach_uprobe_multi(prog, 0, "/proc/self/exe",
                                                "uprobe_consumer_test",
@@ -867,29 +870,55 @@ static int consumer_test(struct uprobe_multi_consumers 
*skel,
                goto cleanup;
 
        for (idx = 0; idx < 4; idx++) {
+               unsigned long had_uretprobes;
                const char *fmt = "BUG";
                __u64 val = 0;
 
-               if (idx < 2) {
+               switch (idx) {
+               case 0:
                        /*
                         * uprobe entry
                         *   +1 if define in 'before'
                         */
                        if (test_bit(idx, before))
                                val++;
-                       fmt = "prog 0/1: uprobe";
-               } else {
+                       fmt = "prog 0: uprobe";
+                       break;
+               case 1:
                        /*
                         * to trigger uretprobe consumer, the uretprobe needs 
to be installed,
                         * which means one of the 'return' uprobes was alive 
when probe was hit:
                         *
-                        *   idxs: 2/3 uprobe return in 'installed' mask
+                        *   idxs: 1/2 uprobe return in 'installed' mask
                         */
-                       unsigned long had_uretprobes  = before & 0b1100; /* is 
uretprobe installed */
+                       had_uretprobes = before & 0b0110; /* is uretprobe 
installed */
 
                        if (had_uretprobes && test_bit(idx, after))
                                val++;
-                       fmt = "idx 2/3: uretprobe";
+                       fmt = "prog 1: uretprobe";
+                       break;
+               case 2:
+                       /*
+                        * session with return
+                        *  +1 if defined in 'before'
+                        *  +1 if defined in 'after'
+                        */
+                       if (test_bit(idx, before)) {
+                               val++;
+                               if (test_bit(idx, after))
+                                       val++;
+                       }
+                       fmt = "prog 2: session with return";
+                       break;
+               case 3:
+                       /*
+                        * session without return
+                        *   +1 if defined in 'before'
+                        */
+                       if (test_bit(idx, before))
+                               val++;
+                       fmt = "prog 3: session with NO return";
+                       break;
                }
 
                if (!ASSERT_EQ(skel->bss->uprobe_result[idx], val, fmt))
@@ -918,8 +947,10 @@ static void test_consumers(void)
         * The idea of this test is to try all possible combinations of
         * uprobes consumers attached on single function.
         *
-        *  - 2 uprobe entry consumer
-        *  - 2 uprobe exit consumers
+        *  - 1 uprobe entry consumer
+        *  - 1 uprobe exit consumer
+        *  - 1 uprobe session with return
+        *  - 1 uprobe session without return
         *
         * The test uses 4 uprobes attached on single function, but that
         * translates into single uprobe with 4 consumers in kernel.
@@ -927,25 +958,24 @@ static void test_consumers(void)
         * The before/after values present the state of attached consumers
         * before and after the probed function:
         *
-        *  bit/prog 0,1 : uprobe entry
-        *  bit/prog 2,3 : uprobe return
+        *  bit/prog 0 : uprobe entry
+        *  bit/prog 1 : uprobe return
         *
         * For example for:
         *
-        *   before = 0b0101
-        *   after  = 0b0110
+        *   before = 0b01
+        *   after  = 0b10
         *
         * it means that before we call 'uprobe_consumer_test' we attach
         * uprobes defined in 'before' value:
         *
-        *   - bit/prog 0: uprobe entry
-        *   - bit/prog 2: uprobe return
+        *   - bit/prog 1: uprobe entry
         *
         * uprobe_consumer_test is called and inside it we attach and detach
         * uprobes based on 'after' value:
         *
-        *   - bit/prog 0: stays untouched
-        *   - bit/prog 2: uprobe return is detached
+        *   - bit/prog 0: is detached
+        *   - bit/prog 1: is attached
         *
         * uprobe_consumer_test returns and we check counters values increased
         * by bpf programs on each uprobe to match the expected count based on
diff --git a/tools/testing/selftests/bpf/progs/uprobe_multi_consumers.c 
b/tools/testing/selftests/bpf/progs/uprobe_multi_consumers.c
index 7e0fdcbbd242..93752bb5690b 100644
--- a/tools/testing/selftests/bpf/progs/uprobe_multi_consumers.c
+++ b/tools/testing/selftests/bpf/progs/uprobe_multi_consumers.c
@@ -24,16 +24,16 @@ int uprobe_1(struct pt_regs *ctx)
        return 0;
 }
 
-SEC("uprobe.multi")
+SEC("uprobe.session")
 int uprobe_2(struct pt_regs *ctx)
 {
        uprobe_result[2]++;
        return 0;
 }
 
-SEC("uprobe.multi")
+SEC("uprobe.session")
 int uprobe_3(struct pt_regs *ctx)
 {
        uprobe_result[3]++;
-       return 0;
+       return 1;
 }
-- 
2.46.2


Reply via email to