diff mbox series

[bpf-next,1/2] bpf: expose __sk_buff wire_len/gso_segs to BPF_PROG_TEST_RUN

Message ID 20191211175349.245622-1-sdf@google.com
State Changes Requested
Delegated to: BPF Maintainers
Headers show
Series [bpf-next,1/2] bpf: expose __sk_buff wire_len/gso_segs to BPF_PROG_TEST_RUN | expand

Commit Message

Stanislav Fomichev Dec. 11, 2019, 5:53 p.m. UTC
wire_len should not be less than real len and is capped by GSO_MAX_SIZE.
gso_segs is capped by GSO_MAX_SEGS.

Signed-off-by: Stanislav Fomichev <sdf@google.com>
---
 net/bpf/test_run.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

Comments

Martin KaFai Lau Dec. 12, 2019, 6:44 p.m. UTC | #1
On Wed, Dec 11, 2019 at 09:53:48AM -0800, Stanislav Fomichev wrote:
> wire_len should not be less than real len and is capped by GSO_MAX_SIZE.
> gso_segs is capped by GSO_MAX_SEGS.
Acked-by: Martin KaFai Lau <kafai@fb.com>
Alexei Starovoitov Dec. 13, 2019, 8:55 p.m. UTC | #2
On Wed, Dec 11, 2019 at 9:53 AM Stanislav Fomichev <sdf@google.com> wrote:
>
> wire_len should not be less than real len and is capped by GSO_MAX_SIZE.
> gso_segs is capped by GSO_MAX_SEGS.
>
> Signed-off-by: Stanislav Fomichev <sdf@google.com>

This change breaks tests:
./test_progs -n 16
test_kfree_skb:PASS:prog_load sched cls 0 nsec
test_kfree_skb:PASS:prog_load raw tp 0 nsec
test_kfree_skb:PASS:find_prog 0 nsec
test_kfree_skb:PASS:find_prog 0 nsec
test_kfree_skb:PASS:find_prog 0 nsec
test_kfree_skb:PASS:find global data 0 nsec
test_kfree_skb:PASS:attach_raw_tp 0 nsec
test_kfree_skb:PASS:attach fentry 0 nsec
test_kfree_skb:PASS:attach fexit 0 nsec
test_kfree_skb:PASS:find_perf_buf_map 0 nsec
test_kfree_skb:PASS:perf_buf__new 0 nsec
test_kfree_skb:FAIL:ipv6 err -1 errno 22 retval 0 duration 0
on_sample:PASS:check_size 0 nsec
on_sample:PASS:check_meta_ifindex 0 nsec
on_sample:PASS:check_cb8_0 0 nsec
on_sample:PASS:check_cb32_0 0 nsec
on_sample:PASS:check_eth 0 nsec
on_sample:PASS:check_ip 0 nsec
on_sample:PASS:check_tcp 0 nsec
test_kfree_skb:PASS:perf_buffer__poll 0 nsec
test_kfree_skb:PASS:get_result 0 nsec
#16 kfree_skb:FAIL
Summary: 0/0 PASSED, 0 SKIPPED, 1 FAILED
Stanislav Fomichev Dec. 13, 2019, 9:23 p.m. UTC | #3
On 12/13, Alexei Starovoitov wrote:
> On Wed, Dec 11, 2019 at 9:53 AM Stanislav Fomichev <sdf@google.com> wrote:
> >
> > wire_len should not be less than real len and is capped by GSO_MAX_SIZE.
> > gso_segs is capped by GSO_MAX_SEGS.
> >
> > Signed-off-by: Stanislav Fomichev <sdf@google.com>
> 
> This change breaks tests:
> ./test_progs -n 16
> test_kfree_skb:PASS:prog_load sched cls 0 nsec
> test_kfree_skb:PASS:prog_load raw tp 0 nsec
> test_kfree_skb:PASS:find_prog 0 nsec
> test_kfree_skb:PASS:find_prog 0 nsec
> test_kfree_skb:PASS:find_prog 0 nsec
> test_kfree_skb:PASS:find global data 0 nsec
> test_kfree_skb:PASS:attach_raw_tp 0 nsec
> test_kfree_skb:PASS:attach fentry 0 nsec
> test_kfree_skb:PASS:attach fexit 0 nsec
> test_kfree_skb:PASS:find_perf_buf_map 0 nsec
> test_kfree_skb:PASS:perf_buf__new 0 nsec
> test_kfree_skb:FAIL:ipv6 err -1 errno 22 retval 0 duration 0
> on_sample:PASS:check_size 0 nsec
> on_sample:PASS:check_meta_ifindex 0 nsec
> on_sample:PASS:check_cb8_0 0 nsec
> on_sample:PASS:check_cb32_0 0 nsec
> on_sample:PASS:check_eth 0 nsec
> on_sample:PASS:check_ip 0 nsec
> on_sample:PASS:check_tcp 0 nsec
> test_kfree_skb:PASS:perf_buffer__poll 0 nsec
> test_kfree_skb:PASS:get_result 0 nsec
> #16 kfree_skb:FAIL
> Summary: 0/0 PASSED, 0 SKIPPED, 1 FAILED
Ugh, it's probably because of '__skb->wire_len < skb->len' check.
Let me take a look.

(sorry, I'm still not running/looking at full test_progs because BTF support
is WIP in our toolchain and some subtests fail because of that,
generating a bunch of noise).
Alexei Starovoitov Dec. 13, 2019, 9:30 p.m. UTC | #4
On Fri, Dec 13, 2019 at 1:23 PM Stanislav Fomichev <sdf@fomichev.me> wrote:
>
> On 12/13, Alexei Starovoitov wrote:
> > On Wed, Dec 11, 2019 at 9:53 AM Stanislav Fomichev <sdf@google.com> wrote:
> > >
> > > wire_len should not be less than real len and is capped by GSO_MAX_SIZE.
> > > gso_segs is capped by GSO_MAX_SEGS.
> > >
> > > Signed-off-by: Stanislav Fomichev <sdf@google.com>
> >
> > This change breaks tests:
> > ./test_progs -n 16
> > test_kfree_skb:PASS:prog_load sched cls 0 nsec
> > test_kfree_skb:PASS:prog_load raw tp 0 nsec
> > test_kfree_skb:PASS:find_prog 0 nsec
> > test_kfree_skb:PASS:find_prog 0 nsec
> > test_kfree_skb:PASS:find_prog 0 nsec
> > test_kfree_skb:PASS:find global data 0 nsec
> > test_kfree_skb:PASS:attach_raw_tp 0 nsec
> > test_kfree_skb:PASS:attach fentry 0 nsec
> > test_kfree_skb:PASS:attach fexit 0 nsec
> > test_kfree_skb:PASS:find_perf_buf_map 0 nsec
> > test_kfree_skb:PASS:perf_buf__new 0 nsec
> > test_kfree_skb:FAIL:ipv6 err -1 errno 22 retval 0 duration 0
> > on_sample:PASS:check_size 0 nsec
> > on_sample:PASS:check_meta_ifindex 0 nsec
> > on_sample:PASS:check_cb8_0 0 nsec
> > on_sample:PASS:check_cb32_0 0 nsec
> > on_sample:PASS:check_eth 0 nsec
> > on_sample:PASS:check_ip 0 nsec
> > on_sample:PASS:check_tcp 0 nsec
> > test_kfree_skb:PASS:perf_buffer__poll 0 nsec
> > test_kfree_skb:PASS:get_result 0 nsec
> > #16 kfree_skb:FAIL
> > Summary: 0/0 PASSED, 0 SKIPPED, 1 FAILED
> Ugh, it's probably because of '__skb->wire_len < skb->len' check.
> Let me take a look.
>
> (sorry, I'm still not running/looking at full test_progs because BTF support
> is WIP in our toolchain and some subtests fail because of that,
> generating a bunch of noise).

I thought all bpf-next developers are developing against that tree ?
Are you saying you cannot install the latest clang/pahole on your
development system?
git pull llvm;ninja;ninja install;
git pull pahole; cmake;make
why is it not possible?
Now your complains about skeleton make more sense,
but it's an issue with your particular setup.

Anyway I'm not sure that this test issue is actually an issue with your patch.
It could be that this test is flaky in a weird way. Just with and without your
kernel patch it's 100% reproducible for me and I need to keep the rest
of the patches
moving without introducing failures in my test setup.
All that will get resolved when we have kernel CI.
Stanislav Fomichev Dec. 13, 2019, 10:06 p.m. UTC | #5
On 12/13, Alexei Starovoitov wrote:
> On Fri, Dec 13, 2019 at 1:23 PM Stanislav Fomichev <sdf@fomichev.me> wrote:
> >
> > On 12/13, Alexei Starovoitov wrote:
> > > On Wed, Dec 11, 2019 at 9:53 AM Stanislav Fomichev <sdf@google.com> wrote:
> > > >
> > > > wire_len should not be less than real len and is capped by GSO_MAX_SIZE.
> > > > gso_segs is capped by GSO_MAX_SEGS.
> > > >
> > > > Signed-off-by: Stanislav Fomichev <sdf@google.com>
> > >
> > > This change breaks tests:
> > > ./test_progs -n 16
> > > test_kfree_skb:PASS:prog_load sched cls 0 nsec
> > > test_kfree_skb:PASS:prog_load raw tp 0 nsec
> > > test_kfree_skb:PASS:find_prog 0 nsec
> > > test_kfree_skb:PASS:find_prog 0 nsec
> > > test_kfree_skb:PASS:find_prog 0 nsec
> > > test_kfree_skb:PASS:find global data 0 nsec
> > > test_kfree_skb:PASS:attach_raw_tp 0 nsec
> > > test_kfree_skb:PASS:attach fentry 0 nsec
> > > test_kfree_skb:PASS:attach fexit 0 nsec
> > > test_kfree_skb:PASS:find_perf_buf_map 0 nsec
> > > test_kfree_skb:PASS:perf_buf__new 0 nsec
> > > test_kfree_skb:FAIL:ipv6 err -1 errno 22 retval 0 duration 0
> > > on_sample:PASS:check_size 0 nsec
> > > on_sample:PASS:check_meta_ifindex 0 nsec
> > > on_sample:PASS:check_cb8_0 0 nsec
> > > on_sample:PASS:check_cb32_0 0 nsec
> > > on_sample:PASS:check_eth 0 nsec
> > > on_sample:PASS:check_ip 0 nsec
> > > on_sample:PASS:check_tcp 0 nsec
> > > test_kfree_skb:PASS:perf_buffer__poll 0 nsec
> > > test_kfree_skb:PASS:get_result 0 nsec
> > > #16 kfree_skb:FAIL
> > > Summary: 0/0 PASSED, 0 SKIPPED, 1 FAILED
> > Ugh, it's probably because of '__skb->wire_len < skb->len' check.
> > Let me take a look.
> >
> > (sorry, I'm still not running/looking at full test_progs because BTF support
> > is WIP in our toolchain and some subtests fail because of that,
> > generating a bunch of noise).
> 
> I thought all bpf-next developers are developing against that tree ?
I am developing against that tree, but I have a wrapper around
make that points it to the proper version of cc/tools that we
use for prod builds (for consistency).

> Are you saying you cannot install the latest clang/pahole on your
> development system?
> git pull llvm;ninja;ninja install;
> git pull pahole; cmake;make
> why is it not possible?
Yeah, I'll do that now, it just requires some manual movements :-)

> Now your complains about skeleton make more sense,
> but it's an issue with your particular setup.
> 
> Anyway I'm not sure that this test issue is actually an issue with your patch.
> It could be that this test is flaky in a weird way. Just with and without your
> kernel patch it's 100% reproducible for me and I need to keep the rest
> of the patches
> moving without introducing failures in my test setup.
> All that will get resolved when we have kernel CI.
No, I'm pretty sure that's that wire_len check. I think I need to add
a special case to set it to skb->len if it's zero.
Will follow up with a v2!
diff mbox series

Patch

diff --git a/net/bpf/test_run.c b/net/bpf/test_run.c
index 85c8cbbada92..06cadba2e3b9 100644
--- a/net/bpf/test_run.c
+++ b/net/bpf/test_run.c
@@ -263,8 +263,10 @@  static int convert___skb_to_skb(struct sk_buff *skb, struct __sk_buff *__skb)
 		return -EINVAL;
 
 	/* tstamp is allowed */
+	/* wire_len is allowed */
+	/* gso_segs is allowed */
 
-	if (!range_is_zero(__skb, offsetofend(struct __sk_buff, tstamp),
+	if (!range_is_zero(__skb, offsetofend(struct __sk_buff, gso_segs),
 			   sizeof(struct __sk_buff)))
 		return -EINVAL;
 
@@ -272,6 +274,14 @@  static int convert___skb_to_skb(struct sk_buff *skb, struct __sk_buff *__skb)
 	skb->tstamp = __skb->tstamp;
 	memcpy(&cb->data, __skb->cb, QDISC_CB_PRIV_LEN);
 
+	if (__skb->wire_len < skb->len || __skb->wire_len > GSO_MAX_SIZE)
+		return -EINVAL;
+	cb->pkt_len = __skb->wire_len;
+
+	if (__skb->gso_segs > GSO_MAX_SEGS)
+		return -EINVAL;
+	skb_shinfo(skb)->gso_segs = __skb->gso_segs;
+
 	return 0;
 }
 
@@ -285,6 +295,8 @@  static void convert_skb_to___skb(struct sk_buff *skb, struct __sk_buff *__skb)
 	__skb->priority = skb->priority;
 	__skb->tstamp = skb->tstamp;
 	memcpy(__skb->cb, &cb->data, QDISC_CB_PRIV_LEN);
+	__skb->wire_len = cb->pkt_len;
+	__skb->gso_segs = skb_shinfo(skb)->gso_segs;
 }
 
 int bpf_prog_test_run_skb(struct bpf_prog *prog, const union bpf_attr *kattr,