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

bpf: fix selftests/bpf test_kmod.sh failure when CONFIG_BPF_JIT_ALWAYS_ON=y

With CONFIG_BPF_JIT_ALWAYS_ON is defined in the config file,
tools/testing/selftests/bpf/test_kmod.sh failed like below:
[root@localhost bpf]# ./test_kmod.sh
sysctl: setting key "net.core.bpf_jit_enable": Invalid argument
[ JIT enabled:0 hardened:0 ]
[ 132.175681] test_bpf: #297 BPF_MAXINSNS: Jump, gap, jump, ... FAIL to prog_create err=-524 len=4096
[ 132.458834] test_bpf: Summary: 348 PASSED, 1 FAILED, [340/340 JIT'ed]
[ JIT enabled:1 hardened:0 ]
[ 133.456025] test_bpf: #297 BPF_MAXINSNS: Jump, gap, jump, ... FAIL to prog_create err=-524 len=4096
[ 133.730935] test_bpf: Summary: 348 PASSED, 1 FAILED, [340/340 JIT'ed]
[ JIT enabled:1 hardened:1 ]
[ 134.769730] test_bpf: #297 BPF_MAXINSNS: Jump, gap, jump, ... FAIL to prog_create err=-524 len=4096
[ 135.050864] test_bpf: Summary: 348 PASSED, 1 FAILED, [340/340 JIT'ed]
[ JIT enabled:1 hardened:2 ]
[ 136.442882] test_bpf: #297 BPF_MAXINSNS: Jump, gap, jump, ... FAIL to prog_create err=-524 len=4096
[ 136.821810] test_bpf: Summary: 348 PASSED, 1 FAILED, [340/340 JIT'ed]
[root@localhost bpf]#

The test_kmod.sh load/remove test_bpf.ko multiple times with different
settings for sysctl net.core.bpf_jit_{enable,harden}. The failed test #297
of test_bpf.ko is designed such that JIT always fails.

Commit 290af86629b2 (bpf: introduce BPF_JIT_ALWAYS_ON config)
introduced the following tightening logic:
...
if (!bpf_prog_is_dev_bound(fp->aux)) {
fp = bpf_int_jit_compile(fp);
#ifdef CONFIG_BPF_JIT_ALWAYS_ON
if (!fp->jited) {
*err = -ENOTSUPP;
return fp;
}
#endif
...
With this logic, Test #297 always gets return value -ENOTSUPP
when CONFIG_BPF_JIT_ALWAYS_ON is defined, causing the test failure.

This patch fixed the failure by marking Test #297 as expected failure
when CONFIG_BPF_JIT_ALWAYS_ON is defined.

Fixes: 290af86629b2 (bpf: introduce BPF_JIT_ALWAYS_ON config)
Signed-off-by: Yonghong Song <yhs@fb.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>

authored by

Yonghong Song and committed by
Daniel Borkmann
09584b40 a6b88814

+26 -5
+26 -5
lib/test_bpf.c
··· 83 83 __u32 result; 84 84 } test[MAX_SUBTESTS]; 85 85 int (*fill_helper)(struct bpf_test *self); 86 + int expected_errcode; /* used when FLAG_EXPECTED_FAIL is set in the aux */ 86 87 __u8 frag_data[MAX_DATA]; 87 88 int stack_depth; /* for eBPF only, since tests don't call verifier */ 88 89 }; ··· 2027 2026 }, 2028 2027 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL, 2029 2028 { }, 2030 - { } 2029 + { }, 2030 + .fill_helper = NULL, 2031 + .expected_errcode = -EINVAL, 2031 2032 }, 2032 2033 { 2033 2034 "check: div_k_0", ··· 2039 2036 }, 2040 2037 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL, 2041 2038 { }, 2042 - { } 2039 + { }, 2040 + .fill_helper = NULL, 2041 + .expected_errcode = -EINVAL, 2043 2042 }, 2044 2043 { 2045 2044 "check: unknown insn", ··· 2052 2047 }, 2053 2048 CLASSIC | FLAG_EXPECTED_FAIL, 2054 2049 { }, 2055 - { } 2050 + { }, 2051 + .fill_helper = NULL, 2052 + .expected_errcode = -EINVAL, 2056 2053 }, 2057 2054 { 2058 2055 "check: out of range spill/fill", ··· 2064 2057 }, 2065 2058 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL, 2066 2059 { }, 2067 - { } 2060 + { }, 2061 + .fill_helper = NULL, 2062 + .expected_errcode = -EINVAL, 2068 2063 }, 2069 2064 { 2070 2065 "JUMPS + HOLES", ··· 2158 2149 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL, 2159 2150 { }, 2160 2151 { }, 2152 + .fill_helper = NULL, 2153 + .expected_errcode = -EINVAL, 2161 2154 }, 2162 2155 { 2163 2156 "check: LDX + RET X", ··· 2170 2159 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL, 2171 2160 { }, 2172 2161 { }, 2162 + .fill_helper = NULL, 2163 + .expected_errcode = -EINVAL, 2173 2164 }, 2174 2165 { /* Mainly checking JIT here. */ 2175 2166 "M[]: alt STX + LDX", ··· 2346 2333 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL, 2347 2334 { }, 2348 2335 { }, 2336 + .fill_helper = NULL, 2337 + .expected_errcode = -EINVAL, 2349 2338 }, 2350 2339 { /* Passes checker but fails during runtime. */ 2351 2340 "LD [SKF_AD_OFF-1]", ··· 5410 5395 { }, 5411 5396 { }, 5412 5397 .fill_helper = bpf_fill_maxinsns4, 5398 + .expected_errcode = -EINVAL, 5413 5399 }, 5414 5400 { /* Mainly checking JIT here. */ 5415 5401 "BPF_MAXINSNS: Very long jump", ··· 5466 5450 { 5467 5451 "BPF_MAXINSNS: Jump, gap, jump, ...", 5468 5452 { }, 5453 + #ifdef CONFIG_BPF_JIT_ALWAYS_ON 5454 + CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL, 5455 + #else 5469 5456 CLASSIC | FLAG_NO_DATA, 5457 + #endif 5470 5458 { }, 5471 5459 { { 0, 0xababcbac } }, 5472 5460 .fill_helper = bpf_fill_maxinsns11, 5461 + .expected_errcode = -ENOTSUPP, 5473 5462 }, 5474 5463 { 5475 5464 "BPF_MAXINSNS: ld_abs+get_processor_id", ··· 6365 6344 6366 6345 *err = bpf_prog_create(&fp, &fprog); 6367 6346 if (tests[which].aux & FLAG_EXPECTED_FAIL) { 6368 - if (*err == -EINVAL) { 6347 + if (*err == tests[which].expected_errcode) { 6369 6348 pr_cont("PASS\n"); 6370 6349 /* Verifier rejected filter as expected. */ 6371 6350 *err = 0;