Message ID | 20210510034433.52818-9-kuniyu@amazon.co.jp (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | BPF |
Headers | show |
Series | Socket migration for SO_REUSEPORT. | expand |
Context | Check | Description |
---|---|---|
netdev/cover_letter | success | Link |
netdev/fixes_present | success | Link |
netdev/patch_count | success | Link |
netdev/tree_selection | success | Clearly marked for bpf-next |
netdev/subject_prefix | success | Link |
netdev/cc_maintainers | warning | 6 maintainers not CCed: joe@cilium.io yhs@fb.com kpsingh@kernel.org john.fastabend@gmail.com songliubraving@fb.com quentin@isovalent.com |
netdev/source_inline | success | Was 0 now: 0 |
netdev/verify_signedoff | success | Link |
netdev/module_param | success | Was 0 now: 0 |
netdev/build_32bit | fail | Errors and warnings before: 11360 this patch: 11361 |
netdev/kdoc | success | Errors and warnings before: 0 this patch: 0 |
netdev/verify_fixes | success | Link |
netdev/checkpatch | success | total: 0 errors, 0 warnings, 0 checks, 42 lines checked |
netdev/build_allmodconfig_warn | fail | Errors and warnings before: 11915 this patch: 11916 |
netdev/header_inline | success | Link |
On Mon, May 10, 2021 at 12:44:30PM +0900, Kuniyuki Iwashima wrote: > diff --git a/net/core/filter.c b/net/core/filter.c > index cae56d08a670..3d0f989f5d38 100644 > --- a/net/core/filter.c > +++ b/net/core/filter.c > @@ -10135,6 +10135,8 @@ sk_reuseport_func_proto(enum bpf_func_id func_id, > return &sk_reuseport_load_bytes_proto; > case BPF_FUNC_skb_load_bytes_relative: > return &sk_reuseport_load_bytes_relative_proto; > + case BPF_FUNC_get_socket_cookie: > + return &bpf_get_socket_ptr_cookie_proto; > default: > return bpf_base_func_proto(func_id); > } > @@ -10164,6 +10166,10 @@ sk_reuseport_is_valid_access(int off, int size, > case offsetof(struct sk_reuseport_md, hash): > return size == size_default; > > + case offsetof(struct sk_reuseport_md, sk): > + info->reg_type = ARG_PTR_TO_SOCKET; s/ARG_PTR_TO_SOCKET/PTR_TO_SOCKET/ > + return size == sizeof(__u64); > + > /* Fields that allow narrowing */ > case bpf_ctx_range(struct sk_reuseport_md, eth_protocol): > if (size < sizeof_field(struct sk_buff, protocol))
From: Martin KaFai Lau <kafai@fb.com> Date: Fri, 14 May 2021 18:16:55 -0700 > On Mon, May 10, 2021 at 12:44:30PM +0900, Kuniyuki Iwashima wrote: > > diff --git a/net/core/filter.c b/net/core/filter.c > > index cae56d08a670..3d0f989f5d38 100644 > > --- a/net/core/filter.c > > +++ b/net/core/filter.c > > @@ -10135,6 +10135,8 @@ sk_reuseport_func_proto(enum bpf_func_id func_id, > > return &sk_reuseport_load_bytes_proto; > > case BPF_FUNC_skb_load_bytes_relative: > > return &sk_reuseport_load_bytes_relative_proto; > > + case BPF_FUNC_get_socket_cookie: > > + return &bpf_get_socket_ptr_cookie_proto; > > default: > > return bpf_base_func_proto(func_id); > > } > > @@ -10164,6 +10166,10 @@ sk_reuseport_is_valid_access(int off, int size, > > case offsetof(struct sk_reuseport_md, hash): > > return size == size_default; > > > > + case offsetof(struct sk_reuseport_md, sk): > > + info->reg_type = ARG_PTR_TO_SOCKET; > s/ARG_PTR_TO_SOCKET/PTR_TO_SOCKET/ I'll fix it. Thank you. > > > + return size == sizeof(__u64); > > + > > /* Fields that allow narrowing */ > > case bpf_ctx_range(struct sk_reuseport_md, eth_protocol): > > if (size < sizeof_field(struct sk_buff, protocol))
diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index ec6d85a81744..d2e6bf2d464b 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -5364,6 +5364,7 @@ struct sk_reuseport_md { __u32 ip_protocol; /* IP protocol. e.g. IPPROTO_TCP, IPPROTO_UDP */ __u32 bind_inany; /* Is sock bound to an INANY address? */ __u32 hash; /* A hash of the packet 4 tuples */ + __bpf_md_ptr(struct bpf_sock *, sk); }; #define BPF_TAG_SIZE 8 diff --git a/net/core/filter.c b/net/core/filter.c index cae56d08a670..3d0f989f5d38 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -10135,6 +10135,8 @@ sk_reuseport_func_proto(enum bpf_func_id func_id, return &sk_reuseport_load_bytes_proto; case BPF_FUNC_skb_load_bytes_relative: return &sk_reuseport_load_bytes_relative_proto; + case BPF_FUNC_get_socket_cookie: + return &bpf_get_socket_ptr_cookie_proto; default: return bpf_base_func_proto(func_id); } @@ -10164,6 +10166,10 @@ sk_reuseport_is_valid_access(int off, int size, case offsetof(struct sk_reuseport_md, hash): return size == size_default; + case offsetof(struct sk_reuseport_md, sk): + info->reg_type = ARG_PTR_TO_SOCKET; + return size == sizeof(__u64); + /* Fields that allow narrowing */ case bpf_ctx_range(struct sk_reuseport_md, eth_protocol): if (size < sizeof_field(struct sk_buff, protocol)) @@ -10236,6 +10242,10 @@ static u32 sk_reuseport_convert_ctx_access(enum bpf_access_type type, case offsetof(struct sk_reuseport_md, bind_inany): SK_REUSEPORT_LOAD_FIELD(bind_inany); break; + + case offsetof(struct sk_reuseport_md, sk): + SK_REUSEPORT_LOAD_FIELD(sk); + break; } return insn - insn_buf; diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index ec6d85a81744..d2e6bf2d464b 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -5364,6 +5364,7 @@ struct sk_reuseport_md { __u32 ip_protocol; /* IP protocol. e.g. IPPROTO_TCP, IPPROTO_UDP */ __u32 bind_inany; /* Is sock bound to an INANY address? */ __u32 hash; /* A hash of the packet 4 tuples */ + __bpf_md_ptr(struct bpf_sock *, sk); }; #define BPF_TAG_SIZE 8
We will call sock_reuseport.prog for socket migration in the next commit, so the eBPF program has to know which listener is closing to select a new listener. We can currently get a unique ID of each listener in the userspace by calling bpf_map_lookup_elem() for BPF_MAP_TYPE_REUSEPORT_SOCKARRAY map. This patch makes the pointer of sk available in sk_reuseport_md so that we can get the ID by BPF_FUNC_get_socket_cookie() in the eBPF program. Link: https://lore.kernel.org/netdev/20201119001154.kapwihc2plp4f7zc@kafai-mbp.dhcp.thefacebook.com/ Suggested-by: Martin KaFai Lau <kafai@fb.com> Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.co.jp> --- include/uapi/linux/bpf.h | 1 + net/core/filter.c | 10 ++++++++++ tools/include/uapi/linux/bpf.h | 1 + 3 files changed, 12 insertions(+)