> On Nov 6, 2019, at 10:21 PM, Yonghong Song <yhs@xxxxxx> wrote: > > With latest llvm compiler, running test_progs will have > the following verifier failure for test_sysctl_loop1.o: > libbpf: load bpf program failed: Permission denied > libbpf: -- BEGIN DUMP LOG --- > libbpf: > invalid indirect read from stack var_off (0x0; 0xff)+196 size 7 > ... > libbpf: -- END LOG -- > libbpf: failed to load program 'cgroup/sysctl' > libbpf: failed to load object 'test_sysctl_loop1.o' > > The related bytecodes look below: > 0000000000000308 LBB0_8: > 97: r4 = r10 > 98: r4 += -288 > 99: r4 += r7 > 100: w8 &= 255 > 101: r1 = r10 > 102: r1 += -488 > 103: r1 += r8 > 104: r2 = 7 > 105: r3 = 0 > 106: call 106 > 107: w1 = w0 > 108: w1 += -1 > 109: if w1 > 6 goto -24 <LBB0_5> > 110: w0 += w8 > 111: r7 += 8 > 112: w8 = w0 > 113: if r7 != 224 goto -17 <LBB0_8> > and source code: > for (i = 0; i < ARRAY_SIZE(tcp_mem); ++i) { > ret = bpf_strtoul(value + off, MAX_ULONG_STR_LEN, 0, > tcp_mem + i); > if (ret <= 0 || ret > MAX_ULONG_STR_LEN) > return 0; > off += ret & MAX_ULONG_STR_LEN; > } > Current verifier is not able to conclude register w8 at > insn 110 has a range of 1 to 7, which caused later > verifier complaint. > > Let us workaound this issue until we found a compiler and/or > verifier solution. The workaround in this patch is > to make variable 'ret' volatile, which will force a reload > and then '&' operation to ensure better value range. > With this patch, I got: > #3/17 test_sysctl_loop1.o:OK > > Signed-off-by: Yonghong Song <yhs@xxxxxx> Could you please add the byte code after the patch to the commit log? Thanks, Song