Message ID | 0a48666cfb23d1ceef8d529506e7ad2da90079de.1634301224.git.lorenzo@kernel.org (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | BPF |
Headers | show |
Series | mvneta: introduce XDP multi-buffer support | expand |
Lorenzo Bianconi <lorenzo@kernel.org> writes: > Introduce BPF_F_XDP_MB and the related field in bpf_prog_aux in order to > notify the driver the loaded program support xdp multi-buffer. We should also add some restrictions in the BPF core. In particular, tail call, cpumap and devmap maps should not be able to mix multi-buf and non-multibuf programs. -Toke
> Lorenzo Bianconi <lorenzo@kernel.org> writes: > > > Introduce BPF_F_XDP_MB and the related field in bpf_prog_aux in order to > > notify the driver the loaded program support xdp multi-buffer. > > We should also add some restrictions in the BPF core. In particular, > tail call, cpumap and devmap maps should not be able to mix multi-buf > and non-multibuf programs. ack. How can we detect if a cpumap or a devmap is running in XDP multi-buff mode in order to reject loading the legacy XDP program? Should we just discard the XDP multi-buff in this case? Lorenzo > > -Toke >
Lorenzo Bianconi <lorenzo@kernel.org> writes: >> Lorenzo Bianconi <lorenzo@kernel.org> writes: >> >> > Introduce BPF_F_XDP_MB and the related field in bpf_prog_aux in order to >> > notify the driver the loaded program support xdp multi-buffer. >> >> We should also add some restrictions in the BPF core. In particular, >> tail call, cpumap and devmap maps should not be able to mix multi-buf >> and non-multibuf programs. > > ack. How can we detect if a cpumap or a devmap is running in XDP multi-buff > mode in order to reject loading the legacy XDP program? I was hoping we could copy the same mechanism that tail call maps to ensure that callers and callees are the same type. And amend that to also consider the xdp_mb flag while we're at it :) > Should we just discard the XDP multi-buff in this case? If I'm right in the above, we won't have to because the verifier can ensure that the program types match... -Toke
diff --git a/include/linux/bpf.h b/include/linux/bpf.h index d604c8251d88..1d199501031e 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -868,6 +868,7 @@ struct bpf_prog_aux { bool func_proto_unreliable; bool sleepable; bool tail_call_reachable; + bool xdp_mb; struct hlist_node tramp_hlist; /* BTF_KIND_FUNC_PROTO for valid attach_btf_id */ const struct btf_type *attach_func_proto; diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index 6fc59d61937a..87c10a90c243 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -1110,6 +1110,11 @@ enum bpf_link_type { */ #define BPF_F_SLEEPABLE (1U << 4) +/* If BPF_F_XDP_MB is used in BPF_PROG_LOAD command, the loaded program + * fully support xdp multi-buffer + */ +#define BPF_F_XDP_MB (1U << 5) + /* When BPF ldimm64's insn[0].src_reg != 0 then this can have * the following extensions: * diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 4e50c0bfdb7d..48e4eda2abd5 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -2174,7 +2174,8 @@ static int bpf_prog_load(union bpf_attr *attr, bpfptr_t uattr) BPF_F_ANY_ALIGNMENT | BPF_F_TEST_STATE_FREQ | BPF_F_SLEEPABLE | - BPF_F_TEST_RND_HI32)) + BPF_F_TEST_RND_HI32 | + BPF_F_XDP_MB)) return -EINVAL; if (!IS_ENABLED(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && @@ -2260,6 +2261,7 @@ static int bpf_prog_load(union bpf_attr *attr, bpfptr_t uattr) prog->aux->dst_prog = dst_prog; prog->aux->offload_requested = !!attr->prog_ifindex; prog->aux->sleepable = attr->prog_flags & BPF_F_SLEEPABLE; + prog->aux->xdp_mb = attr->prog_flags & BPF_F_XDP_MB; err = security_bpf_prog_alloc(prog->aux); if (err) diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index 6fc59d61937a..87c10a90c243 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -1110,6 +1110,11 @@ enum bpf_link_type { */ #define BPF_F_SLEEPABLE (1U << 4) +/* If BPF_F_XDP_MB is used in BPF_PROG_LOAD command, the loaded program + * fully support xdp multi-buffer + */ +#define BPF_F_XDP_MB (1U << 5) + /* When BPF ldimm64's insn[0].src_reg != 0 then this can have * the following extensions: *
Introduce BPF_F_XDP_MB and the related field in bpf_prog_aux in order to notify the driver the loaded program support xdp multi-buffer. Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> --- include/linux/bpf.h | 1 + include/uapi/linux/bpf.h | 5 +++++ kernel/bpf/syscall.c | 4 +++- tools/include/uapi/linux/bpf.h | 5 +++++ 4 files changed, 14 insertions(+), 1 deletion(-)