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 4666f88f2bb4f5f7590efc214925dd104be6bbaa..c94fa8d6c4f6d7656437560f859186fb4191b0fa 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;