linux-kselftest.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* bpf: test_sysctl run failed on Debian9
       [not found] <cc5c7dcb-02ab-3ea5-2330-7678abeb43b4@intel.com>
@ 2020-04-23  9:11 ` Ma Xinjian
  2020-04-23 21:31   ` Andrey Ignatov
  0 siblings, 1 reply; 3+ messages in thread
From: Ma Xinjian @ 2020-04-23  9:11 UTC (permalink / raw)
  To: Andrey Ignatov; +Cc: open list:KERNEL SELFTEST FRAMEWORK, bpf, Philip Li

[-- Attachment #1: Type: text/plain, Size: 1039 bytes --]

Hi,  Andrey.

I noticed you add test_sysctl to tools/bpf, so drop this problem to you.

When I run selftests: bpf: test_sysctl, failed with 
"(test_sysctl.c:1490: errno: Permission denied) >>> Loading program 
(./test_sysctl_prog.o) error."


Testing env: "Debian GNU/Linux 9 (stretch)"

kernel: 5.7.0-rc2    5.7.0-rc1  5.6  both failed


Whole run log and kconfig please see the attatchment.

Error info

```

root@vm-snb-42 
/usr/src/perf_selftests-x86_64-rhel-7.6-kselftests-ae83d0b416db002fe95601e7f97f64b59514d936/tools/testing/selftests/bpf# 
./test_sysctl

Test case: sysctl wrong attach_type .. [PASS]
Test case: sysctl:read allow all .. [PASS]
Test case: sysctl:read deny all .. [PASS]

[snip]

libbpf: -- END LOG --
libbpf: failed to load program 'cgroup/sysctl'
libbpf: failed to load object './test_sysctl_prog.o'
(test_sysctl.c:1490: errno: Permission denied) >>> Loading program 
(./test_sysctl_prog.o) error.

Test case: C prog: read tcp_mem .. [FAIL]
Summary: 37 PASSED, 3 FAILED

```

-- 
Best Regards.
Ma Xinjian



[-- Attachment #2: bpf_test_sysctl_log.gz --]
[-- Type: application/gzip, Size: 2761 bytes --]

[-- Attachment #3: kconfig.gz --]
[-- Type: application/gzip, Size: 49062 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: bpf: test_sysctl run failed on Debian9
  2020-04-23  9:11 ` bpf: test_sysctl run failed on Debian9 Ma Xinjian
@ 2020-04-23 21:31   ` Andrey Ignatov
  2020-04-26  8:04     ` Ma Xinjian
  0 siblings, 1 reply; 3+ messages in thread
From: Andrey Ignatov @ 2020-04-23 21:31 UTC (permalink / raw)
  To: Ma Xinjian
  Cc: open list:KERNEL SELFTEST FRAMEWORK, bpf, Philip Li, ast, daniel

[-- Attachment #1: Type: text/plain, Size: 5537 bytes --]

Ma Xinjian <max.xinjian@intel.com> [Thu, 2020-04-23 02:12 -0700]:
> Hi,  Andrey.
> 
> I noticed you add test_sysctl to tools/bpf, so drop this problem to you.
> 
> When I run selftests: bpf: test_sysctl, failed with "(test_sysctl.c:1490:
> errno: Permission denied) >>> Loading program (./test_sysctl_prog.o) error."
> 
> 
> Testing env: "Debian GNU/Linux 9 (stretch)"
> 
> kernel: 5.7.0-rc2    5.7.0-rc1  5.6  both failed
> 
> 
> Whole run log and kconfig please see the attatchment.
> 
> Error info
> 
> ```
> 
> root@vm-snb-42 /usr/src/perf_selftests-x86_64-rhel-7.6-kselftests-ae83d0b416db002fe95601e7f97f64b59514d936/tools/testing/selftests/bpf#
> ./test_sysctl
> 
> Test case: sysctl wrong attach_type .. [PASS]
> Test case: sysctl:read allow all .. [PASS]
> Test case: sysctl:read deny all .. [PASS]
> 
> [snip]
> 
> libbpf: -- END LOG --
> libbpf: failed to load program 'cgroup/sysctl'
> libbpf: failed to load object './test_sysctl_prog.o'
> (test_sysctl.c:1490: errno: Permission denied) >>> Loading program
> (./test_sysctl_prog.o) error.
> 
> Test case: C prog: read tcp_mem .. [FAIL]
> Summary: 37 PASSED, 3 FAILED

Hi Ma,

I can not reproduce it. I built 5.7.0-rc2 with your config (with minor
changes to just make it work with my qemu-setup, specifically
CONFIG_EXT4_FS=y), built tests and run it, no failures:

	root@arch-fb-vm1:/home/rdna/bpf-next/tools/testing/selftests/bpf uname -srm
	Linux 5.7.0-rc2 x86_64
	root@arch-fb-vm1:/home/rdna/bpf-next/tools/testing/selftests/bpf ./test_sysctl
	...
	Test case: C prog: deny all writes .. [PASS]
	Test case: C prog: deny access by name .. [PASS]
	Test case: C prog: read tcp_mem .. [PASS]
	Summary: 40 PASSED, 0 FAILED

Thouhg I see that test_sysctl_prog.o program I have differs from what
you have. I attach test_sysctl_prog_xlated.gz with my program.

Specifically the difference starts after the first call to bpf_strtoul.

The code from my prog looks like this (from the first call to
bpf_strtoul to the second call to bpf_strtoul):

	  71: (85) call bpf_strtoul#110448
	  72: (bc) w7 = w0
	; if (ret <= 0 || ret > MAX_ULONG_STR_LEN)
	  73: (bc) w1 = w7
	  74: (04) w1 += -1
	  75: (26) if w1 > 0xe goto pc-21
	; off += ret & MAX_ULONG_STR_LEN;
	  76: (54) w7 &= 15
	  77: (bf) r1 = r10
	  78: (07) r1 += -64
	; ret = bpf_strtoul(value + off, MAX_ULONG_STR_LEN, 0,
	  79: (0f) r1 += r7
	; tcp_mem + i);
	  80: (bf) r4 = r10
	  81: (07) r4 += -80
	; ret = bpf_strtoul(value + off, MAX_ULONG_STR_LEN, 0,
	  82: (b7) r2 = 15
	  83: (b7) r3 = 0
	  84: (85) call bpf_strtoul#110448

It can be seen that r1 points to stack-64 + r7 that is known to be <15.

This is basically `value + (ret & MAX_ULONG_STR_LEN)` from the C code.

The code from your version of program looks like this:

	  70: (85) call bpf_strtoul#106
	last_idx 70 first_idx 63
	regs=4 stack=0 before 69: (b7) r3 = 0
	regs=4 stack=0 before 68: (b7) r2 = 15
	  71: (bc) w7 = w0
	; if (ret <= 0 || ret > MAX_ULONG_STR_LEN)
	  72: (bc) w1 = w7
	  73: (04) w1 += -1
	  74: (26) if w1 > 0xe goto pc+14
	 R0=inv(id=0) R1_w=inv(id=0,umax_value=14,var_off=(0x0; 0xf)) R6=inv0 R7_w=inv(id=0,smax_value=2147483647,umax_value=4294967295,var_off=(0x0; 0xffffffff)) R10=fp0 fp-8=mmmmmmmm fp-16=mmmmmmmm fp-24=mmmmmmmm fp-32=mmmmmmmm fp-40=mmmmmmmm fp-48=mmmmmmmm fp-56=mmmmmmmm fp-64=mmmmmmmm fp-72=00000000 fp-80=00000000 fp-88=mmmmmmmm
	; ret = bpf_strtoul(value + off, MAX_ULONG_STR_LEN, 0,
	  75: (bc) w2 = w7
	  76: (67) r2 <<= 32
	  77: (77) r2 >>= 32
	  78: (bf) r1 = r10
	;
	  79: (07) r1 += -64
	; ret = bpf_strtoul(value + off, MAX_ULONG_STR_LEN, 0,
	  80: (0f) r1 += r2
	last_idx 80 first_idx 71
	regs=4 stack=0 before 79: (07) r1 += -64
	regs=4 stack=0 before 78: (bf) r1 = r10
	regs=4 stack=0 before 77: (77) r2 >>= 32
	regs=4 stack=0 before 76: (67) r2 <<= 32
	regs=4 stack=0 before 75: (bc) w2 = w7
	regs=80 stack=0 before 74: (26) if w1 > 0xe goto pc+14
	regs=80 stack=0 before 73: (04) w1 += -1
	regs=80 stack=0 before 72: (bc) w1 = w7
	regs=80 stack=0 before 71: (bc) w7 = w0
	 R0_rw=invP(id=0) R6=inv0 R7=ctx(id=0,off=0,imm=0) R10=fp0 fp-8=mmmmmmmm fp-16=mmmmmmmm fp-24=mmmmmmmm fp-32=mmmmmmmm fp-40=mmmmmmmm fp-48=mmmmmmmm fp-56=mmmmmmmm fp-64=mmmmmmmm fp-72=00000000 fp-80=00000000 fp-88=mmmmmmmm
	parent didn't have regs=1 stack=0 marks
	last_idx 70 first_idx 63
	regs=1 stack=0 before 70: (85) call bpf_strtoul#106
	; tcp_mem + i);
	  81: (bf) r4 = r10
	  82: (07) r4 += -80
	; ret = bpf_strtoul(value + off, MAX_ULONG_STR_LEN, 0,
	  83: (b7) r2 = 15
	  84: (b7) r3 = 0
	  85: (85) call bpf_strtoul#106
	R1 unbounded indirect variable offset stack access
	processed 88 insns (limit 1000000) max_states_per_insn 0 total_states 7 peak_states 7 mark_read 6

In this case r1 points to stack-64 + r2 and it seems to me that the
state of r2 is the problem, but I don't undesrtand why.

32LSB of r2 seems to be known because:
	  71: (bc) w7 = w0
	  72: (bc) w1 = w7
	  73: (04) w1 += -1
	  74: (26) if w1 > 0xe goto pc+14
	  75: (bc) w2 = w7

and 32MSB of r2 are cleared because:
	  76: (67) r2 <<= 32
	  77: (77) r2 >>= 32

So it seems to me that r2 has to be known and in (0x0; 0xf) range.

To summarize:

* I see that your program differs what may mean you have different
  environemnt where you build BPF proga (e.g. different clang/llvm
  version), FWIW I have clang version 9.0.20190721 (though it's heavily
  patched facebook version).

* I'm not quite sure why verifier rejects your version of the program --
  here we would need more eyes. I'm cc'ing Alexei and Daniel.


-- 
Andrey Ignatov

[-- Attachment #2: test_sysctl_prog_xlated.gz --]
[-- Type: application/x-gunzip, Size: 1303 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: bpf: test_sysctl run failed on Debian9
  2020-04-23 21:31   ` Andrey Ignatov
@ 2020-04-26  8:04     ` Ma Xinjian
  0 siblings, 0 replies; 3+ messages in thread
From: Ma Xinjian @ 2020-04-26  8:04 UTC (permalink / raw)
  To: Andrey Ignatov
  Cc: open list:KERNEL SELFTEST FRAMEWORK, bpf, Philip Li, ast, daniel


On 4/24/20 5:31 AM, Andrey Ignatov wrote:
> Ma Xinjian <max.xinjian@intel.com> [Thu, 2020-04-23 02:12 -0700]:
>> Hi,  Andrey.
>>
>> I noticed you add test_sysctl to tools/bpf, so drop this problem to you.
>>
>> When I run selftests: bpf: test_sysctl, failed with "(test_sysctl.c:1490:
>> errno: Permission denied) >>> Loading program (./test_sysctl_prog.o) error."
>>
>>
>> Testing env: "Debian GNU/Linux 9 (stretch)"
>>
>> kernel: 5.7.0-rc2    5.7.0-rc1  5.6  both failed
>>
>>
>> Whole run log and kconfig please see the attatchment.
>>
>> Error info
>>
>> ```
>>
>> root@vm-snb-42 /usr/src/perf_selftests-x86_64-rhel-7.6-kselftests-ae83d0b416db002fe95601e7f97f64b59514d936/tools/testing/selftests/bpf#
>> ./test_sysctl
>>
>> Test case: sysctl wrong attach_type .. [PASS]
>> Test case: sysctl:read allow all .. [PASS]
>> Test case: sysctl:read deny all .. [PASS]
>>
>> [snip]
>>
>> libbpf: -- END LOG --
>> libbpf: failed to load program 'cgroup/sysctl'
>> libbpf: failed to load object './test_sysctl_prog.o'
>> (test_sysctl.c:1490: errno: Permission denied) >>> Loading program
>> (./test_sysctl_prog.o) error.
>>
>> Test case: C prog: read tcp_mem .. [FAIL]
>> Summary: 37 PASSED, 3 FAILED
> Hi Ma,
>
> I can not reproduce it. I built 5.7.0-rc2 with your config (with minor
> changes to just make it work with my qemu-setup, specifically
> CONFIG_EXT4_FS=y), built tests and run it, no failures:
>
> 	root@arch-fb-vm1:/home/rdna/bpf-next/tools/testing/selftests/bpf uname -srm
> 	Linux 5.7.0-rc2 x86_64
> 	root@arch-fb-vm1:/home/rdna/bpf-next/tools/testing/selftests/bpf ./test_sysctl
> 	...
> 	Test case: C prog: deny all writes .. [PASS]
> 	Test case: C prog: deny access by name .. [PASS]
> 	Test case: C prog: read tcp_mem .. [PASS]
> 	Summary: 40 PASSED, 0 FAILED
>
> Thouhg I see that test_sysctl_prog.o program I have differs from what
> you have. I attach test_sysctl_prog_xlated.gz with my program.
>
> Specifically the difference starts after the first call to bpf_strtoul.
>
> The code from my prog looks like this (from the first call to
> bpf_strtoul to the second call to bpf_strtoul):
>
> 	  71: (85) call bpf_strtoul#110448
> 	  72: (bc) w7 = w0
> 	; if (ret <= 0 || ret > MAX_ULONG_STR_LEN)
> 	  73: (bc) w1 = w7
> 	  74: (04) w1 += -1
> 	  75: (26) if w1 > 0xe goto pc-21
> 	; off += ret & MAX_ULONG_STR_LEN;
> 	  76: (54) w7 &= 15
> 	  77: (bf) r1 = r10
> 	  78: (07) r1 += -64
> 	; ret = bpf_strtoul(value + off, MAX_ULONG_STR_LEN, 0,
> 	  79: (0f) r1 += r7
> 	; tcp_mem + i);
> 	  80: (bf) r4 = r10
> 	  81: (07) r4 += -80
> 	; ret = bpf_strtoul(value + off, MAX_ULONG_STR_LEN, 0,
> 	  82: (b7) r2 = 15
> 	  83: (b7) r3 = 0
> 	  84: (85) call bpf_strtoul#110448
>
> It can be seen that r1 points to stack-64 + r7 that is known to be <15.
>
> This is basically `value + (ret & MAX_ULONG_STR_LEN)` from the C code.
>
> The code from your version of program looks like this:
>
> 	  70: (85) call bpf_strtoul#106
> 	last_idx 70 first_idx 63
> 	regs=4 stack=0 before 69: (b7) r3 = 0
> 	regs=4 stack=0 before 68: (b7) r2 = 15
> 	  71: (bc) w7 = w0
> 	; if (ret <= 0 || ret > MAX_ULONG_STR_LEN)
> 	  72: (bc) w1 = w7
> 	  73: (04) w1 += -1
> 	  74: (26) if w1 > 0xe goto pc+14
> 	 R0=inv(id=0) R1_w=inv(id=0,umax_value=14,var_off=(0x0; 0xf)) R6=inv0 R7_w=inv(id=0,smax_value=2147483647,umax_value=4294967295,var_off=(0x0; 0xffffffff)) R10=fp0 fp-8=mmmmmmmm fp-16=mmmmmmmm fp-24=mmmmmmmm fp-32=mmmmmmmm fp-40=mmmmmmmm fp-48=mmmmmmmm fp-56=mmmmmmmm fp-64=mmmmmmmm fp-72=00000000 fp-80=00000000 fp-88=mmmmmmmm
> 	; ret = bpf_strtoul(value + off, MAX_ULONG_STR_LEN, 0,
> 	  75: (bc) w2 = w7
> 	  76: (67) r2 <<= 32
> 	  77: (77) r2 >>= 32
> 	  78: (bf) r1 = r10
> 	;
> 	  79: (07) r1 += -64
> 	; ret = bpf_strtoul(value + off, MAX_ULONG_STR_LEN, 0,
> 	  80: (0f) r1 += r2
> 	last_idx 80 first_idx 71
> 	regs=4 stack=0 before 79: (07) r1 += -64
> 	regs=4 stack=0 before 78: (bf) r1 = r10
> 	regs=4 stack=0 before 77: (77) r2 >>= 32
> 	regs=4 stack=0 before 76: (67) r2 <<= 32
> 	regs=4 stack=0 before 75: (bc) w2 = w7
> 	regs=80 stack=0 before 74: (26) if w1 > 0xe goto pc+14
> 	regs=80 stack=0 before 73: (04) w1 += -1
> 	regs=80 stack=0 before 72: (bc) w1 = w7
> 	regs=80 stack=0 before 71: (bc) w7 = w0
> 	 R0_rw=invP(id=0) R6=inv0 R7=ctx(id=0,off=0,imm=0) R10=fp0 fp-8=mmmmmmmm fp-16=mmmmmmmm fp-24=mmmmmmmm fp-32=mmmmmmmm fp-40=mmmmmmmm fp-48=mmmmmmmm fp-56=mmmmmmmm fp-64=mmmmmmmm fp-72=00000000 fp-80=00000000 fp-88=mmmmmmmm
> 	parent didn't have regs=1 stack=0 marks
> 	last_idx 70 first_idx 63
> 	regs=1 stack=0 before 70: (85) call bpf_strtoul#106
> 	; tcp_mem + i);
> 	  81: (bf) r4 = r10
> 	  82: (07) r4 += -80
> 	; ret = bpf_strtoul(value + off, MAX_ULONG_STR_LEN, 0,
> 	  83: (b7) r2 = 15
> 	  84: (b7) r3 = 0
> 	  85: (85) call bpf_strtoul#106
> 	R1 unbounded indirect variable offset stack access
> 	processed 88 insns (limit 1000000) max_states_per_insn 0 total_states 7 peak_states 7 mark_read 6
>
> In this case r1 points to stack-64 + r2 and it seems to me that the
> state of r2 is the problem, but I don't undesrtand why.
>
> 32LSB of r2 seems to be known because:
> 	  71: (bc) w7 = w0
> 	  72: (bc) w1 = w7
> 	  73: (04) w1 += -1
> 	  74: (26) if w1 > 0xe goto pc+14
> 	  75: (bc) w2 = w7
>
> and 32MSB of r2 are cleared because:
> 	  76: (67) r2 <<= 32
> 	  77: (77) r2 >>= 32
>
> So it seems to me that r2 has to be known and in (0x0; 0xf) range.
>
> To summarize:
>
> * I see that your program differs what may mean you have different
>    environemnt where you build BPF proga (e.g. different clang/llvm
>    version), FWIW I have clang version 9.0.20190721 (though it's heavily
>    patched facebook version).

Hi, Andrey.

Thank you very much for your quick reply.

I have tried build with 9.0.* clang, but failed with

```

libbpf: failed to find BTF for extern 'CONFIG_BPF_SYSCALL': -2
Error: failed to open BPF object file: 0
Makefile:361: recipe for target 
'/usr/src/perf_selftests-x86_64-rhel-7.6-kselftests-8f3d9f354286745c751374f5f1fcafee6b3f3136/tools/testing/selftests/bpf/test_skeleton.skel.h' 
failed
```
This error was tracked in:
https://www.spinics.net/lists/netdev/msg646956.html

So I have rebuild with clang 10.0.0. Still the same error.

>
> * I'm not quite sure why verifier rejects your version of the program --
>    here we would need more eyes. I'm cc'ing Alexei and Daniel.
>
>

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-04-26  8:04 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <cc5c7dcb-02ab-3ea5-2330-7678abeb43b4@intel.com>
2020-04-23  9:11 ` bpf: test_sysctl run failed on Debian9 Ma Xinjian
2020-04-23 21:31   ` Andrey Ignatov
2020-04-26  8:04     ` Ma Xinjian

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).