OSDN Git Service

selftests/bpf: enhance align selftest's expected log matching
authorAndrii Nakryiko <andrii@kernel.org>
Thu, 2 Mar 2023 23:50:01 +0000 (15:50 -0800)
committerAlexei Starovoitov <ast@kernel.org>
Sat, 4 Mar 2023 19:14:31 +0000 (11:14 -0800)
Allow to search for expected register state in all the verifier log
output that's related to specified instruction number.

See added comment for an example of possible situation that is happening
due to a simple enhancement done in the next patch, which fixes handling
of env->test_state_freq flag in state checkpointing logic.

Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/r/20230302235015.2044271-4-andrii@kernel.org
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/prog_tests/align.c

index 4666f88..c94fa8d 100644 (file)
@@ -660,16 +660,22 @@ static int do_test_single(struct bpf_align_test *test)
                         * func#0 @0
                         * 0: R1=ctx(off=0,imm=0) R10=fp0
                         * 0: (b7) r3 = 2                 ; R3_w=2
+                        *
+                        * Sometimes it's actually two lines below, e.g. when
+                        * searching for "6: R3_w=scalar(umax=255,var_off=(0x0; 0xff))":
+                        *   from 4 to 6: R0_w=pkt(off=8,r=8,imm=0) R1=ctx(off=0,imm=0) R2_w=pkt(off=0,r=8,imm=0) R3_w=pkt_end(off=0,imm=0) R10=fp0
+                        *   6: R0_w=pkt(off=8,r=8,imm=0) R1=ctx(off=0,imm=0) R2_w=pkt(off=0,r=8,imm=0) R3_w=pkt_end(off=0,imm=0) R10=fp0
+                        *   6: (71) r3 = *(u8 *)(r2 +0)           ; R2_w=pkt(off=0,r=8,imm=0) R3_w=scalar(umax=255,var_off=(0x0; 0xff))
                         */
-                       if (!strstr(line_ptr, m.match)) {
+                       while (!strstr(line_ptr, m.match)) {
                                cur_line = -1;
                                line_ptr = strtok(NULL, "\n");
-                               sscanf(line_ptr, "%u: ", &cur_line);
+                               sscanf(line_ptr ?: "", "%u: ", &cur_line);
+                               if (!line_ptr || cur_line != m.line)
+                                       break;
                        }
-                       if (cur_line != m.line || !line_ptr ||
-                           !strstr(line_ptr, m.match)) {
-                               printf("Failed to find match %u: %s\n",
-                                      m.line, m.match);
+                       if (cur_line != m.line || !line_ptr || !strstr(line_ptr, m.match)) {
+                               printf("Failed to find match %u: %s\n", m.line, m.match);
                                ret = 1;
                                printf("%s", bpf_vlog);
                                break;