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
Cc: bpf@vger.kernel.org, Yafang Shao <laoar.shao@gmail.com>
Subject: [PATCH v7 bpf-next 2/2] selftests/bpf: Add selftest for bits iter
Date: Mon, 6 May 2024 11:33:53 +0800 [thread overview]
Message-ID: <20240506033353.28505-3-laoar.shao@gmail.com> (raw)
In-Reply-To: <20240506033353.28505-1-laoar.shao@gmail.com>
Add test cases for the bits iter:
- positive case
- bit mask smaller than 8 bytes
- a typical case of having 8-byte bit mask
- another typical case where bit mask is > 8 bytes
- the index of set bit
- nagative cases
- bpf_iter_bits_destroy() is required after calling
bpf_iter_bits_new()
- bpf_iter_bits_destroy() can only destroy an initialized iter
- bpf_iter_bits_next() must use an initialized iter
Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
---
.../selftests/bpf/prog_tests/verifier.c | 2 +
.../selftests/bpf/progs/verifier_bits_iter.c | 160 ++++++++++++++++++
2 files changed, 162 insertions(+)
create mode 100644 tools/testing/selftests/bpf/progs/verifier_bits_iter.c
diff --git a/tools/testing/selftests/bpf/prog_tests/verifier.c b/tools/testing/selftests/bpf/prog_tests/verifier.c
index c4f9f306646e..7e04ecaaa20a 100644
--- a/tools/testing/selftests/bpf/prog_tests/verifier.c
+++ b/tools/testing/selftests/bpf/prog_tests/verifier.c
@@ -84,6 +84,7 @@
#include "verifier_xadd.skel.h"
#include "verifier_xdp.skel.h"
#include "verifier_xdp_direct_packet_access.skel.h"
+#include "verifier_bits_iter.skel.h"
#define MAX_ENTRIES 11
@@ -198,6 +199,7 @@ void test_verifier_var_off(void) { RUN(verifier_var_off); }
void test_verifier_xadd(void) { RUN(verifier_xadd); }
void test_verifier_xdp(void) { RUN(verifier_xdp); }
void test_verifier_xdp_direct_packet_access(void) { RUN(verifier_xdp_direct_packet_access); }
+void test_verifier_bits_iter(void) { RUN(verifier_bits_iter); }
static int init_test_val_map(struct bpf_object *obj, char *map_name)
{
diff --git a/tools/testing/selftests/bpf/progs/verifier_bits_iter.c b/tools/testing/selftests/bpf/progs/verifier_bits_iter.c
new file mode 100644
index 000000000000..2f7b62b25638
--- /dev/null
+++ b/tools/testing/selftests/bpf/progs/verifier_bits_iter.c
@@ -0,0 +1,160 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/* Copyright (c) 2024 Yafang Shao <laoar.shao@gmail.com> */
+
+#include "vmlinux.h"
+#include <bpf/bpf_helpers.h>
+#include <bpf/bpf_tracing.h>
+
+#include "bpf_misc.h"
+#include "task_kfunc_common.h"
+
+char _license[] SEC("license") = "GPL";
+
+int bpf_iter_bits_new(struct bpf_iter_bits *it, const void *unsafe_ptr__ign,
+ u32 nr_bits) __ksym __weak;
+int *bpf_iter_bits_next(struct bpf_iter_bits *it) __ksym __weak;
+void bpf_iter_bits_destroy(struct bpf_iter_bits *it) __ksym __weak;
+
+SEC("iter.s/cgroup")
+__description("bits iter without destroy")
+__failure __msg("Unreleased reference")
+int BPF_PROG(no_destroy, struct bpf_iter_meta *meta, struct cgroup *cgrp)
+{
+ struct bpf_iter_bits it;
+ struct task_struct *p;
+
+ p = bpf_task_from_pid(1);
+ if (!p)
+ return 1;
+
+ bpf_iter_bits_new(&it, p->cpus_ptr, 8192);
+
+ bpf_iter_bits_next(&it);
+ bpf_task_release(p);
+ return 0;
+}
+
+SEC("iter/cgroup")
+__description("bits iter with uninitialized iter in ->next()")
+__failure __msg("expected an initialized iter_bits as arg #1")
+int BPF_PROG(next_uninit, struct bpf_iter_meta *meta, struct cgroup *cgrp)
+{
+ struct bpf_iter_bits *it = NULL;
+
+ bpf_iter_bits_next(it);
+ return 0;
+}
+
+SEC("iter/cgroup")
+__description("bits iter with uninitialized iter in ->destroy()")
+__failure __msg("expected an initialized iter_bits as arg #1")
+int BPF_PROG(destroy_uninit, struct bpf_iter_meta *meta, struct cgroup *cgrp)
+{
+ struct bpf_iter_bits it = {};
+
+ bpf_iter_bits_destroy(&it);
+ return 0;
+}
+
+SEC("syscall")
+__description("bits copy 32")
+__success __retval(10)
+int bits_copy32(void)
+{
+ /* 21 bits: --------------------- */
+ u32 data = 0b11111101111101111100001000100101U;
+ int nr = 0, offset = 0;
+ int *bit;
+
+#if defined(__TARGET_ARCH_s390)
+ offset = sizeof(u32) - (21 + 7) / 8;
+#endif
+ bpf_for_each(bits, bit, ((char *)&data) + offset, 21)
+ nr++;
+ return nr;
+}
+
+SEC("syscall")
+__description("bits copy 64")
+__success __retval(18)
+int bits_copy64(void)
+{
+ /* 34 bits: ~-------- */
+ u64 data = 0xffffefdf0f0f0f0fUL;
+ int nr = 0, offset = 0;
+ int *bit;
+
+#if defined(__TARGET_ARCH_s390)
+ offset = sizeof(u64) - (34 + 7) / 8;
+#endif
+
+ bpf_for_each(bits, bit, ((char *)&data) + offset, 34)
+ nr++;
+ return nr;
+}
+
+SEC("syscall")
+__description("bits memalloc long-aligned")
+__success __retval(32) /* 16 * 2 */
+int bits_memalloc(void)
+{
+ char data[16];
+ int nr = 0;
+ int *bit;
+
+ __builtin_memset(&data, 0x48, sizeof(data));
+ bpf_for_each(bits, bit, &data, sizeof(data) * 8)
+ nr++;
+ return nr;
+}
+
+SEC("syscall")
+__description("bits memalloc non-long-aligned")
+__success __retval(85) /* 17 * 5*/
+int bits_memalloc_non_aligned(void)
+{
+ char data[17];
+ int nr = 0;
+ int *bit;
+
+ __builtin_memset(&data, 0x1f, sizeof(data));
+ bpf_for_each(bits, bit, &data, sizeof(data) * 8)
+ nr++;
+ return nr;
+}
+
+SEC("syscall")
+__description("bits memalloc non-aligned-bits")
+__success __retval(27) /* 8 * 3 + 3 */
+int bits_memalloc_non_aligned_bits(void)
+{
+ char data[16];
+ int nr = 0;
+ int *bit;
+
+ __builtin_memset(&data, 0x31, sizeof(data));
+ /* Different with all other bytes */
+ data[8] = 0xf7;
+
+ bpf_for_each(bits, bit, &data, 68)
+ nr++;
+ return nr;
+}
+
+
+SEC("syscall")
+__description("bit index")
+__success __retval(8)
+int bit_index(void)
+{
+ u64 data = 0x100;
+ int bit_idx = 0;
+ int *bit;
+
+ bpf_for_each(bits, bit, &data, 64) {
+ if (*bit == 0)
+ continue;
+ bit_idx = *bit;
+ }
+ return bit_idx;
+}
--
2.30.1 (Apple Git-130)
next prev parent reply other threads:[~2024-05-06 3:35 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-06 3:33 [PATCH v7 bpf-next 0/2] bpf: Add a generic bits iterator Yafang Shao
2024-05-06 3:33 ` [PATCH v7 bpf-next 1/2] bpf: Add " Yafang Shao
2024-05-07 3:38 ` Andrii Nakryiko
2024-05-07 13:32 ` Yafang Shao
2024-05-07 17:09 ` Andrii Nakryiko
2024-05-06 3:33 ` Yafang Shao [this message]
2024-05-07 3:42 ` [PATCH v7 bpf-next 2/2] selftests/bpf: Add selftest for bits iter Andrii Nakryiko
2024-05-07 13:38 ` Yafang Shao
2024-05-07 17:11 ` Andrii Nakryiko
2024-05-09 2:11 ` Yafang Shao
2024-05-09 22:03 ` 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=20240506033353.28505-3-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=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