From: Amery Hung <ameryhung@gmail.com>
To: netdev@vger.kernel.org
Cc: bpf@vger.kernel.org, daniel@iogearbox.net, andrii@kernel.org,
alexei.starovoitov@gmail.com, martin.lau@kernel.org,
kuba@kernel.org, edumazet@google.com, xiyou.wangcong@gmail.com,
jhs@mojatatu.com, sinquersw@gmail.com, toke@redhat.com,
jiri@resnulli.us, stfomichev@gmail.com,
ekarani.silvestre@ccc.ufcg.edu.br, yangpeihao@sjtu.edu.cn,
yepeilin.cs@gmail.com, ameryhung@gmail.com, kernel-team@meta.com
Subject: [PATCH bpf-next v5 07/13] bpf: net_sched: Support updating qstats
Date: Thu, 13 Mar 2025 12:03:01 -0700 [thread overview]
Message-ID: <20250313190309.2545711-8-ameryhung@gmail.com> (raw)
In-Reply-To: <20250313190309.2545711-1-ameryhung@gmail.com>
From: Amery Hung <amery.hung@bytedance.com>
Allow bpf qdisc programs to update Qdisc qstats directly with btf struct
access.
Signed-off-by: Amery Hung <amery.hung@bytedance.com>
---
net/sched/bpf_qdisc.c | 53 ++++++++++++++++++++++++++++++++++++-------
1 file changed, 45 insertions(+), 8 deletions(-)
diff --git a/net/sched/bpf_qdisc.c b/net/sched/bpf_qdisc.c
index edf01f3f1c2a..6ad3050275a4 100644
--- a/net/sched/bpf_qdisc.c
+++ b/net/sched/bpf_qdisc.c
@@ -36,6 +36,7 @@ bpf_qdisc_get_func_proto(enum bpf_func_id func_id,
}
}
+BTF_ID_LIST_SINGLE(bpf_qdisc_ids, struct, Qdisc)
BTF_ID_LIST_SINGLE(bpf_sk_buff_ids, struct, sk_buff)
BTF_ID_LIST_SINGLE(bpf_sk_buff_ptr_ids, struct, bpf_sk_buff_ptr)
@@ -60,20 +61,37 @@ static bool bpf_qdisc_is_valid_access(int off, int size,
return bpf_tracing_btf_ctx_access(off, size, type, prog, info);
}
-static int bpf_qdisc_btf_struct_access(struct bpf_verifier_log *log,
- const struct bpf_reg_state *reg,
- int off, int size)
+static int bpf_qdisc_qdisc_access(struct bpf_verifier_log *log,
+ const struct bpf_reg_state *reg,
+ int off, int size)
{
- const struct btf_type *t, *skbt;
size_t end;
- skbt = btf_type_by_id(reg->btf, bpf_sk_buff_ids[0]);
- t = btf_type_by_id(reg->btf, reg->btf_id);
- if (t != skbt) {
- bpf_log(log, "only read is supported\n");
+ switch (off) {
+ case offsetof(struct Qdisc, qstats) ... offsetofend(struct Qdisc, qstats) - 1:
+ end = offsetofend(struct Qdisc, qstats);
+ break;
+ default:
+ bpf_log(log, "no write support to Qdisc at off %d\n", off);
+ return -EACCES;
+ }
+
+ if (off + size > end) {
+ bpf_log(log,
+ "write access at off %d with size %d beyond the member of Qdisc ended at %zu\n",
+ off, size, end);
return -EACCES;
}
+ return 0;
+}
+
+static int bpf_qdisc_sk_buff_access(struct bpf_verifier_log *log,
+ const struct bpf_reg_state *reg,
+ int off, int size)
+{
+ size_t end;
+
switch (off) {
case offsetof(struct sk_buff, tstamp):
end = offsetofend(struct sk_buff, tstamp);
@@ -115,6 +133,25 @@ static int bpf_qdisc_btf_struct_access(struct bpf_verifier_log *log,
return 0;
}
+static int bpf_qdisc_btf_struct_access(struct bpf_verifier_log *log,
+ const struct bpf_reg_state *reg,
+ int off, int size)
+{
+ const struct btf_type *t, *skbt, *qdisct;
+
+ skbt = btf_type_by_id(reg->btf, bpf_sk_buff_ids[0]);
+ qdisct = btf_type_by_id(reg->btf, bpf_qdisc_ids[0]);
+ t = btf_type_by_id(reg->btf, reg->btf_id);
+
+ if (t == skbt)
+ return bpf_qdisc_sk_buff_access(log, reg, off, size);
+ else if (t == qdisct)
+ return bpf_qdisc_qdisc_access(log, reg, off, size);
+
+ bpf_log(log, "only read is supported\n");
+ return -EACCES;
+}
+
BTF_ID_LIST(bpf_qdisc_init_prologue_ids)
BTF_ID(func, bpf_qdisc_init_prologue)
--
2.47.1
next prev parent reply other threads:[~2025-03-13 19:03 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-13 19:02 [PATCH bpf-next v5 00/13] bpf qdisc Amery Hung
2025-03-13 19:02 ` [PATCH bpf-next v5 01/13] bpf: Prepare to reuse get_ctx_arg_idx Amery Hung
2025-03-13 19:02 ` [PATCH bpf-next v5 02/13] bpf: Generalize finding member offset of struct_ops prog Amery Hung
2025-03-13 19:02 ` [PATCH bpf-next v5 03/13] bpf: net_sched: Support implementation of Qdisc_ops in bpf Amery Hung
2025-03-13 19:02 ` [PATCH bpf-next v5 04/13] bpf: net_sched: Add basic bpf qdisc kfuncs Amery Hung
2025-03-14 20:14 ` Alexei Starovoitov
2025-03-17 19:44 ` Amery Hung
2025-03-13 19:02 ` [PATCH bpf-next v5 05/13] bpf: net_sched: Add a qdisc watchdog timer Amery Hung
2025-03-13 19:03 ` [PATCH bpf-next v5 06/13] bpf: net_sched: Support updating bstats Amery Hung
2025-03-13 19:03 ` Amery Hung [this message]
2025-03-14 20:24 ` [PATCH bpf-next v5 07/13] bpf: net_sched: Support updating qstats Alexei Starovoitov
2025-03-16 13:56 ` Amery Hung
2025-03-13 19:03 ` [PATCH bpf-next v5 08/13] bpf: net_sched: Allow writing to more Qdisc members Amery Hung
2025-03-13 19:03 ` [PATCH bpf-next v5 09/13] bpf: net_sched: Disable attaching bpf qdisc to non root Amery Hung
2025-03-14 20:31 ` Alexei Starovoitov
2025-03-16 13:58 ` Amery Hung
2025-03-13 19:03 ` [PATCH bpf-next v5 10/13] libbpf: Support creating and destroying qdisc Amery Hung
2025-03-13 19:03 ` [PATCH bpf-next v5 11/13] selftests/bpf: Add a basic fifo qdisc test Amery Hung
2025-03-13 19:03 ` [PATCH bpf-next v5 12/13] selftests/bpf: Add a bpf fq qdisc to selftest Amery Hung
2025-03-14 20:35 ` Alexei Starovoitov
2025-03-17 1:25 ` Amery Hung
2025-03-13 19:03 ` [PATCH bpf-next v5 13/13] selftests/bpf: Test attaching bpf qdisc to mq and non root Amery Hung
2025-03-13 19:52 ` [PATCH bpf-next v5 00/13] bpf qdisc Toke Høiland-Jørgensen
2025-03-14 1:43 ` Amery Hung
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=20250313190309.2545711-8-ameryhung@gmail.com \
--to=ameryhung@gmail.com \
--cc=alexei.starovoitov@gmail.com \
--cc=andrii@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=edumazet@google.com \
--cc=ekarani.silvestre@ccc.ufcg.edu.br \
--cc=jhs@mojatatu.com \
--cc=jiri@resnulli.us \
--cc=kernel-team@meta.com \
--cc=kuba@kernel.org \
--cc=martin.lau@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=sinquersw@gmail.com \
--cc=stfomichev@gmail.com \
--cc=toke@redhat.com \
--cc=xiyou.wangcong@gmail.com \
--cc=yangpeihao@sjtu.edu.cn \
--cc=yepeilin.cs@gmail.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).