From: Zhu Yanjun <yanjun.zhu@linux.dev>
To: "D. Wythe" <alibuda@linux.alibaba.com>,
kgraul@linux.ibm.com, wenjia@linux.ibm.com, jaka@linux.ibm.com,
ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org,
martin.lau@linux.dev, pabeni@redhat.com, song@kernel.org,
sdf@google.com, haoluo@google.com, yhs@fb.com,
edumazet@google.com, john.fastabend@gmail.com,
kpsingh@kernel.org, jolsa@kernel.org, guwen@linux.alibaba.com
Cc: kuba@kernel.org, davem@davemloft.net, netdev@vger.kernel.org,
linux-s390@vger.kernel.org, linux-rdma@vger.kernel.org,
bpf@vger.kernel.org
Subject: Re: [PATCH bpf-next v3 3/5] net/smc: bpf: register smc_ops info struct_ops
Date: Thu, 26 Dec 2024 20:44:20 +0100 [thread overview]
Message-ID: <525a2714-f8b0-4fdb-9cfb-d8a913c43c8e@linux.dev> (raw)
In-Reply-To: <20241218024422.23423-4-alibuda@linux.alibaba.com>
在 2024/12/18 3:44, D. Wythe 写道:
> To implement injection capability for smc via struct_ops, so that
> user can make their own smc_ops to modify the behavior of smc stack.
>
> Currently, user can write their own implememtion to choose whether to
> use SMC or not before TCP 3rd handshake to be comleted. In the future,
> users can implement more complex functions on smc by expanding it.
>
> Signed-off-by: D. Wythe <alibuda@linux.alibaba.com>
> ---
> net/smc/af_smc.c | 10 +++++
> net/smc/smc_ops.c | 99 +++++++++++++++++++++++++++++++++++++++++++++++
> net/smc/smc_ops.h | 2 +
> 3 files changed, 111 insertions(+)
>
> diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c
> index 9d76e902fd77..6adedae2986d 100644
> --- a/net/smc/af_smc.c
> +++ b/net/smc/af_smc.c
> @@ -55,6 +55,7 @@
> #include "smc_sysctl.h"
> #include "smc_loopback.h"
> #include "smc_inet.h"
> +#include "smc_ops.h"
>
> static DEFINE_MUTEX(smc_server_lgr_pending); /* serialize link group
> * creation on server
> @@ -3576,8 +3577,17 @@ static int __init smc_init(void)
> pr_err("%s: smc_inet_init fails with %d\n", __func__, rc);
> goto out_ulp;
> }
> +
> + rc = smc_bpf_struct_ops_init();
> + if (rc) {
> + pr_err("%s: smc_bpf_struct_ops_init fails with %d\n", __func__, rc);
> + goto out_inet;
> + }
> +
> static_branch_enable(&tcp_have_smc);
> return 0;
> +out_inet:
> + smc_inet_exit();
> out_ulp:
> tcp_unregister_ulp(&smc_ulp_ops);
> out_lo:
> diff --git a/net/smc/smc_ops.c b/net/smc/smc_ops.c
> index 0fc19cadd760..0f07652f4837 100644
> --- a/net/smc/smc_ops.c
> +++ b/net/smc/smc_ops.c
> @@ -10,6 +10,10 @@
> * Author: D. Wythe <alibuda@linux.alibaba.com>
> */
>
> +#include <linux/bpf_verifier.h>
> +#include <linux/bpf.h>
> +#include <linux/btf.h>
> +
> #include "smc_ops.h"
>
> static DEFINE_SPINLOCK(smc_ops_list_lock);
> @@ -49,3 +53,98 @@ struct smc_ops *smc_ops_find_by_name(const char *name)
> }
> return NULL;
> }
> +
> +static int __bpf_smc_stub_set_tcp_option(struct tcp_sock *tp) { return 1; }
> +static int __bpf_smc_stub_set_tcp_option_cond(const struct tcp_sock *tp,
> + struct inet_request_sock *ireq)
> +{
> + return 1;
> +}
> +
> +static struct smc_ops __bpf_smc_bpf_ops = {
> + .set_option = __bpf_smc_stub_set_tcp_option,
> + .set_option_cond = __bpf_smc_stub_set_tcp_option_cond,
> +};
> +
> +static int smc_bpf_ops_init(struct btf *btf) { return 0; }
> +
> +static int smc_bpf_ops_reg(void *kdata, struct bpf_link *link)
> +{
> + return smc_ops_reg(kdata);
> +}
> +
> +static void smc_bpf_ops_unreg(void *kdata, struct bpf_link *link)
> +{
> + smc_ops_unreg(kdata);
> +}
> +
> +static int smc_bpf_ops_init_member(const struct btf_type *t,
> + const struct btf_member *member,
> + void *kdata, const void *udata)
> +{
> + const struct smc_ops *u_ops;
> + struct smc_ops *k_ops;
> + u32 moff;
> +
> + u_ops = (const struct smc_ops *)udata;
> + k_ops = (struct smc_ops *)kdata;
> +
> + moff = __btf_member_bit_offset(t, member) / 8;
> + switch (moff) {
> + case offsetof(struct smc_ops, name):
> + if (bpf_obj_name_cpy(k_ops->name, u_ops->name,
> + sizeof(u_ops->name)) <= 0)
> + return -EINVAL;
> + return 1;
> + case offsetof(struct smc_ops, flags):
> + if (u_ops->flags & ~SMC_OPS_ALL_FLAGS)
> + return -EINVAL;
> + k_ops->flags = u_ops->flags;
> + return 1;
> + default:
> + break;
> + }
> +
> + return 0;
> +}
> +
> +static int smc_bpf_ops_check_member(const struct btf_type *t,
> + const struct btf_member *member,
> + const struct bpf_prog *prog)
> +{
> + u32 moff = __btf_member_bit_offset(t, member) / 8;
> +
> + switch (moff) {
> + case offsetof(struct smc_ops, name):
> + case offsetof(struct smc_ops, flags):
> + case offsetof(struct smc_ops, set_option):
> + case offsetof(struct smc_ops, set_option_cond):
> + break;
> + default:
> + return -EINVAL;
> + }
> +
> + return 0;
> +}
> +
> +static const struct bpf_verifier_ops smc_bpf_verifier_ops = {
> + .get_func_proto = bpf_base_func_proto,
> + .is_valid_access = bpf_tracing_btf_ctx_access,
> +};
> +
> +static struct bpf_struct_ops bpf_smc_bpf_ops = {
> + .name = "smc_ops",
> + .init = smc_bpf_ops_init,
> + .reg = smc_bpf_ops_reg,
> + .unreg = smc_bpf_ops_unreg,
> + .cfi_stubs = &__bpf_smc_bpf_ops,
> + .verifier_ops = &smc_bpf_verifier_ops,
> + .init_member = smc_bpf_ops_init_member,
> + .check_member = smc_bpf_ops_check_member,
> + .owner = THIS_MODULE,
> +};
> +
> +int smc_bpf_struct_ops_init(void)
> +{
> + return register_bpf_struct_ops(&bpf_smc_bpf_ops, smc_ops);
> +}
> diff --git a/net/smc/smc_ops.h b/net/smc/smc_ops.h
> index 214f4c99efd4..f4e50eae13f6 100644
> --- a/net/smc/smc_ops.h
> +++ b/net/smc/smc_ops.h
> @@ -22,8 +22,10 @@
> * Note: Caller MUST ensure it's was invoked under rcu_read_lock.
> */
> struct smc_ops *smc_ops_find_by_name(const char *name);
> +int smc_bpf_struct_ops_init(void);
> #else
> static inline struct smc_ops *smc_ops_find_by_name(const char *name) { return NULL; }
> +static inline int smc_bpf_struct_ops_init(void) { return 0; }
Both smc_ops_find_by_name and smc_bpf_struct_ops_init seem to be dead
codes. Enabling/Disabling CONFIG_SMC_OPS, the above 2 inline functions
will not be called. The 2 functions should be removed.
Zhu Yanjun
> #endif /* CONFIG_SMC_OPS*/
>
> #endif /* __SMC_OPS */
next prev parent reply other threads:[~2024-12-26 19:44 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-12-18 2:44 [PATCH bpf-next v3 0/5] net/smc: Introduce smc_ops D. Wythe
2024-12-18 2:44 ` [PATCH bpf-next v3 1/5] bpf: export necessary sympols for modules with struct_ops D. Wythe
2024-12-18 2:44 ` [PATCH bpf-next v3 2/5] net/smc: Introduce generic hook smc_ops D. Wythe
2024-12-18 2:44 ` [PATCH bpf-next v3 3/5] net/smc: bpf: register smc_ops info struct_ops D. Wythe
2024-12-19 22:48 ` Martin KaFai Lau
2024-12-23 2:00 ` D. Wythe
2024-12-26 19:44 ` Zhu Yanjun [this message]
2025-01-03 6:54 ` D. Wythe
2024-12-18 2:44 ` [PATCH bpf-next v3 4/5] libbpf: fix error when st-prefix_ops and ops from differ btf D. Wythe
2024-12-19 22:43 ` Martin KaFai Lau
2024-12-23 2:10 ` D. Wythe
2025-01-07 23:24 ` Martin KaFai Lau
2025-01-08 13:45 ` D. Wythe
2025-01-10 23:38 ` Andrii Nakryiko
2025-01-14 7:11 ` D. Wythe
2024-12-18 2:44 ` [PATCH bpf-next v3 5/5] bpf/selftests: add selftest for bpf_smc_ops D. Wythe
2024-12-19 22:59 ` Martin KaFai Lau
2024-12-23 2:03 ` D. Wythe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=525a2714-f8b0-4fdb-9cfb-d8a913c43c8e@linux.dev \
--to=yanjun.zhu@linux.dev \
--cc=alibuda@linux.alibaba.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=guwen@linux.alibaba.com \
--cc=haoluo@google.com \
--cc=jaka@linux.ibm.com \
--cc=john.fastabend@gmail.com \
--cc=jolsa@kernel.org \
--cc=kgraul@linux.ibm.com \
--cc=kpsingh@kernel.org \
--cc=kuba@kernel.org \
--cc=linux-rdma@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=martin.lau@linux.dev \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=sdf@google.com \
--cc=song@kernel.org \
--cc=wenjia@linux.ibm.com \
--cc=yhs@fb.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).