From: Yafang Shao <laoar.shao@gmail.com>
To: ast@kernel.org, daniel@iogearbox.net, john.fastabend@gmail.com,
andrii@kernel.org, martin.lau@linux.dev, eddyz87@gmail.com,
song@kernel.org, yonghong.song@linux.dev, kpsingh@kernel.org,
sdf@google.com, haoluo@google.com, jolsa@kernel.org,
tj@kernel.org, void@manifault.com
Cc: bpf@vger.kernel.org, Yafang Shao <laoar.shao@gmail.com>
Subject: [PATCH v6 bpf-next 1/5] bpf: Add bpf_iter_cpumask kfuncs
Date: Tue, 6 Feb 2024 16:14:12 +0800 [thread overview]
Message-ID: <20240206081416.26242-2-laoar.shao@gmail.com> (raw)
In-Reply-To: <20240206081416.26242-1-laoar.shao@gmail.com>
Add three new kfuncs for bpf_iter_cpumask.
- bpf_iter_cpumask_new
KF_RCU is defined because the cpumask must be a RCU trusted pointer
such as task->cpus_ptr.
- bpf_iter_cpumask_next
- bpf_iter_cpumask_destroy
These new kfuncs facilitate the iteration of percpu data, such as
runqueues, psi_cgroup_cpu, and more.
Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
---
kernel/bpf/cpumask.c | 79 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 79 insertions(+)
diff --git a/kernel/bpf/cpumask.c b/kernel/bpf/cpumask.c
index dad0fb1c8e87..ed6078cfa40e 100644
--- a/kernel/bpf/cpumask.c
+++ b/kernel/bpf/cpumask.c
@@ -422,6 +422,82 @@ __bpf_kfunc u32 bpf_cpumask_weight(const struct cpumask *cpumask)
return cpumask_weight(cpumask);
}
+struct bpf_iter_cpumask {
+ __u64 __opaque[2];
+} __aligned(8);
+
+struct bpf_iter_cpumask_kern {
+ struct cpumask *mask;
+ int cpu;
+} __aligned(8);
+
+/**
+ * bpf_iter_cpumask_new() - Initialize a new CPU mask iterator for a given CPU mask
+ * @it: The new bpf_iter_cpumask to be created.
+ * @mask: The cpumask to be iterated over.
+ *
+ * This function initializes a new bpf_iter_cpumask structure for iterating over
+ * the specified CPU mask. It assigns the provided cpumask to the newly created
+ * bpf_iter_cpumask @it for subsequent iteration operations.
+ *
+ * On success, 0 is returned. On failure, ERR is returned.
+ */
+__bpf_kfunc int bpf_iter_cpumask_new(struct bpf_iter_cpumask *it, const struct cpumask *mask)
+{
+ struct bpf_iter_cpumask_kern *kit = (void *)it;
+
+ BUILD_BUG_ON(sizeof(struct bpf_iter_cpumask_kern) > sizeof(struct bpf_iter_cpumask));
+ BUILD_BUG_ON(__alignof__(struct bpf_iter_cpumask_kern) !=
+ __alignof__(struct bpf_iter_cpumask));
+
+ kit->mask = bpf_mem_alloc(&bpf_global_ma, cpumask_size());
+ if (!kit->mask)
+ return -ENOMEM;
+
+ cpumask_copy(kit->mask, mask);
+ kit->cpu = -1;
+ return 0;
+}
+
+/**
+ * bpf_iter_cpumask_next() - Get the next CPU in a bpf_iter_cpumask
+ * @it: The bpf_iter_cpumask
+ *
+ * This function returns a pointer to a number representing the ID of the
+ * next CPU in CPU mask. It allows sequential access to CPUs within the
+ * cpumask. If there are no further CPUs available, it returns NULL.
+ */
+__bpf_kfunc int *bpf_iter_cpumask_next(struct bpf_iter_cpumask *it)
+{
+ struct bpf_iter_cpumask_kern *kit = (void *)it;
+ const struct cpumask *mask = kit->mask;
+ int cpu;
+
+ if (!mask)
+ return NULL;
+ cpu = cpumask_next(kit->cpu, mask);
+ if (cpu >= nr_cpu_ids)
+ return NULL;
+
+ kit->cpu = cpu;
+ return &kit->cpu;
+}
+
+/**
+ * bpf_iter_cpumask_destroy() - Destroy a bpf_iter_cpumask
+ * @it: The bpf_iter_cpumask to be destroyed.
+ *
+ * Destroy the resource associated with the bpf_iter_cpumask.
+ */
+__bpf_kfunc void bpf_iter_cpumask_destroy(struct bpf_iter_cpumask *it)
+{
+ struct bpf_iter_cpumask_kern *kit = (void *)it;
+
+ if (!kit->mask)
+ return;
+ bpf_mem_free(&bpf_global_ma, kit->mask);
+}
+
__bpf_kfunc_end_defs();
BTF_KFUNCS_START(cpumask_kfunc_btf_ids)
@@ -450,6 +526,9 @@ BTF_ID_FLAGS(func, bpf_cpumask_copy, KF_RCU)
BTF_ID_FLAGS(func, bpf_cpumask_any_distribute, KF_RCU)
BTF_ID_FLAGS(func, bpf_cpumask_any_and_distribute, KF_RCU)
BTF_ID_FLAGS(func, bpf_cpumask_weight, KF_RCU)
+BTF_ID_FLAGS(func, bpf_iter_cpumask_new, KF_ITER_NEW | KF_RCU)
+BTF_ID_FLAGS(func, bpf_iter_cpumask_next, KF_ITER_NEXT | KF_RET_NULL)
+BTF_ID_FLAGS(func, bpf_iter_cpumask_destroy, KF_ITER_DESTROY)
BTF_KFUNCS_END(cpumask_kfunc_btf_ids)
static const struct btf_kfunc_id_set cpumask_kfunc_set = {
--
2.39.1
next prev parent reply other threads:[~2024-02-06 8:14 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-06 8:14 [PATCH v6 bpf-next 0/5] bpf: Add bpf_iter_cpumask Yafang Shao
2024-02-06 8:14 ` Yafang Shao [this message]
2024-02-07 1:06 ` [PATCH v6 bpf-next 1/5] bpf: Add bpf_iter_cpumask kfuncs Alexei Starovoitov
2024-02-07 3:24 ` Yafang Shao
2024-02-06 8:14 ` [PATCH v6 bpf-next 2/5] bpf, docs: Add document for cpumask iter Yafang Shao
2024-02-06 8:14 ` [PATCH v6 bpf-next 3/5] selftests/bpf: Fix error checking for cpumask_success__load() Yafang Shao
2024-02-06 8:14 ` [PATCH v6 bpf-next 4/5] selftests/bpf: Mark cpumask kfunc declarations as __weak Yafang Shao
2024-02-06 15:48 ` Daniel Xu
2024-02-06 8:14 ` [PATCH v6 bpf-next 5/5] selftests/bpf: Add selftests for cpumask iter Yafang Shao
2024-02-08 0:18 ` [PATCH v6 bpf-next 0/5] bpf: Add bpf_iter_cpumask Andrii Nakryiko
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=20240206081416.26242-2-laoar.shao@gmail.com \
--to=laoar.shao@gmail.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=eddyz87@gmail.com \
--cc=haoluo@google.com \
--cc=john.fastabend@gmail.com \
--cc=jolsa@kernel.org \
--cc=kpsingh@kernel.org \
--cc=martin.lau@linux.dev \
--cc=sdf@google.com \
--cc=song@kernel.org \
--cc=tj@kernel.org \
--cc=void@manifault.com \
--cc=yonghong.song@linux.dev \
/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