From: Namhyung Kim <namhyung@kernel.org>
To: Alexei Starovoitov <ast@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
Andrii Nakryiko <andrii@kernel.org>
Cc: Martin KaFai Lau <martin.lau@linux.dev>,
Eduard Zingerman <eddyz87@gmail.com>, Song Liu <song@kernel.org>,
Yonghong Song <yonghong.song@linux.dev>,
John Fastabend <john.fastabend@gmail.com>,
KP Singh <kpsingh@kernel.org>,
Stanislav Fomichev <sdf@fomichev.me>, Hao Luo <haoluo@google.com>,
Jiri Olsa <jolsa@kernel.org>, LKML <linux-kernel@vger.kernel.org>,
bpf@vger.kernel.org, Andrew Morton <akpm@linux-foundation.org>,
Christoph Lameter <cl@linux.com>,
Pekka Enberg <penberg@kernel.org>,
David Rientjes <rientjes@google.com>,
Joonsoo Kim <iamjoonsoo.kim@lge.com>,
Vlastimil Babka <vbabka@suse.cz>,
Roman Gushchin <roman.gushchin@linux.dev>,
Hyeonggon Yoo <42.hyeyoo@gmail.com>,
linux-mm@kvack.org, Arnaldo Carvalho de Melo <acme@kernel.org>
Subject: Re: [RFC/PATCH bpf-next 3/3] selftests/bpf: Add a test for kmem_cache_iter
Date: Sat, 28 Sep 2024 23:13:36 -0700 [thread overview]
Message-ID: <ZvjwEH3QXkjUCu8Z@google.com> (raw)
In-Reply-To: <20240927184133.968283-4-namhyung@kernel.org>
On Fri, Sep 27, 2024 at 11:41:33AM -0700, Namhyung Kim wrote:
> The test traverses all slab caches using the kmem_cache_iter and check
> if current task's pointer is from "task_struct" slab cache.
>
> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
> ---
> .../bpf/prog_tests/kmem_cache_iter.c | 64 ++++++++++++++++++
> tools/testing/selftests/bpf/progs/bpf_iter.h | 7 ++
> .../selftests/bpf/progs/kmem_cache_iter.c | 66 +++++++++++++++++++
> 3 files changed, 137 insertions(+)
> create mode 100644 tools/testing/selftests/bpf/prog_tests/kmem_cache_iter.c
> create mode 100644 tools/testing/selftests/bpf/progs/kmem_cache_iter.c
>
> diff --git a/tools/testing/selftests/bpf/prog_tests/kmem_cache_iter.c b/tools/testing/selftests/bpf/prog_tests/kmem_cache_iter.c
> new file mode 100644
> index 0000000000000000..814bcc453e9f3ccd
> --- /dev/null
> +++ b/tools/testing/selftests/bpf/prog_tests/kmem_cache_iter.c
> @@ -0,0 +1,64 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/* Copyright (c) 2024 Google */
> +
> +#include <test_progs.h>
> +#include <bpf/libbpf.h>
> +#include <bpf/btf.h>
> +#include "kmem_cache_iter.skel.h"
> +
> +static void test_kmem_cache_iter_check_task(struct kmem_cache_iter *skel)
> +{
> + LIBBPF_OPTS(bpf_test_run_opts, opts,
> + .flags = BPF_F_TEST_RUN_ON_CPU,
> + );
> + int prog_fd = bpf_program__fd(skel->progs.check_task_struct);
> +
> + /* get task_struct and check it if's from a slab cache */
> + bpf_prog_test_run_opts(prog_fd, &opts);
> +
> + /* the BPF program should set 'found' variable */
> + ASSERT_EQ(skel->bss->found, 1, "found task_struct");
Hmm.. I'm seeing a failure with found being -1, which means ...
> +}
> +
> +void test_kmem_cache_iter(void)
> +{
> + DECLARE_LIBBPF_OPTS(bpf_iter_attach_opts, opts);
> + struct kmem_cache_iter *skel = NULL;
> + union bpf_iter_link_info linfo = {};
> + struct bpf_link *link;
> + char buf[1024];
> + int iter_fd;
> +
> + skel = kmem_cache_iter__open_and_load();
> + if (!ASSERT_OK_PTR(skel, "kmem_cache_iter__open_and_load"))
> + return;
> +
> + opts.link_info = &linfo;
> + opts.link_info_len = sizeof(linfo);
> +
> + link = bpf_program__attach_iter(skel->progs.slab_info_collector, &opts);
> + if (!ASSERT_OK_PTR(link, "attach_iter"))
> + goto destroy;
> +
> + iter_fd = bpf_iter_create(bpf_link__fd(link));
> + if (!ASSERT_GE(iter_fd, 0, "iter_create"))
> + goto free_link;
> +
> + memset(buf, 0, sizeof(buf));
> + while (read(iter_fd, buf, sizeof(buf) > 0)) {
> + /* read out all contents */
> + printf("%s", buf);
> + }
> +
> + /* next reads should return 0 */
> + ASSERT_EQ(read(iter_fd, buf, sizeof(buf)), 0, "read");
> +
> + test_kmem_cache_iter_check_task(skel);
> +
> + close(iter_fd);
> +
> +free_link:
> + bpf_link__destroy(link);
> +destroy:
> + kmem_cache_iter__destroy(skel);
> +}
> diff --git a/tools/testing/selftests/bpf/progs/bpf_iter.h b/tools/testing/selftests/bpf/progs/bpf_iter.h
> index c41ee80533ca219a..3305dc3a74b32481 100644
> --- a/tools/testing/selftests/bpf/progs/bpf_iter.h
> +++ b/tools/testing/selftests/bpf/progs/bpf_iter.h
> @@ -24,6 +24,7 @@
> #define BTF_F_PTR_RAW BTF_F_PTR_RAW___not_used
> #define BTF_F_ZERO BTF_F_ZERO___not_used
> #define bpf_iter__ksym bpf_iter__ksym___not_used
> +#define bpf_iter__kmem_cache bpf_iter__kmem_cache___not_used
> #include "vmlinux.h"
> #undef bpf_iter_meta
> #undef bpf_iter__bpf_map
> @@ -48,6 +49,7 @@
> #undef BTF_F_PTR_RAW
> #undef BTF_F_ZERO
> #undef bpf_iter__ksym
> +#undef bpf_iter__kmem_cache
>
> struct bpf_iter_meta {
> struct seq_file *seq;
> @@ -165,3 +167,8 @@ struct bpf_iter__ksym {
> struct bpf_iter_meta *meta;
> struct kallsym_iter *ksym;
> };
> +
> +struct bpf_iter__kmem_cache {
> + struct bpf_iter_meta *meta;
> + struct kmem_cache *s;
> +} __attribute__((preserve_access_index));
> diff --git a/tools/testing/selftests/bpf/progs/kmem_cache_iter.c b/tools/testing/selftests/bpf/progs/kmem_cache_iter.c
> new file mode 100644
> index 0000000000000000..3f6ec15a1bf6344c
> --- /dev/null
> +++ b/tools/testing/selftests/bpf/progs/kmem_cache_iter.c
> @@ -0,0 +1,66 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/* Copyright (c) 2024 Google */
> +
> +#include "bpf_iter.h"
> +#include <bpf/bpf_helpers.h>
> +#include <bpf/bpf_tracing.h>
> +
> +char _license[] SEC("license") = "GPL";
> +
> +#define SLAB_NAME_MAX 256
> +
> +struct {
> + __uint(type, BPF_MAP_TYPE_HASH);
> + __uint(key_size, sizeof(void *));
> + __uint(value_size, SLAB_NAME_MAX);
> + __uint(max_entries, 1024);
> +} slab_hash SEC(".maps");
> +
> +extern struct kmem_cache *bpf_get_kmem_cache(__u64 addr) __ksym;
> +
> +/* result, will be checked by userspace */
> +int found;
> +
> +SEC("iter/kmem_cache")
> +int slab_info_collector(struct bpf_iter__kmem_cache *ctx)
> +{
> + struct seq_file *seq = ctx->meta->seq;
> + struct kmem_cache *s = ctx->s;
> +
> + if (s) {
> + char name[SLAB_NAME_MAX];
> +
> + /*
> + * To make sure if the slab_iter implements the seq interface
> + * properly and it's also useful for debugging.
> + */
> + BPF_SEQ_PRINTF(seq, "%s: %u\n", s->name, s->object_size);
> +
> + bpf_probe_read_kernel_str(name, sizeof(name), s->name);
> + bpf_map_update_elem(&slab_hash, &s, name, BPF_NOEXIST);
> + }
> +
> + return 0;
> +}
> +
> +SEC("raw_tp/bpf_test_finish")
> +int BPF_PROG(check_task_struct)
> +{
> + __u64 curr = bpf_get_current_task();
> + struct kmem_cache *s;
> + char *name;
> +
> + s = bpf_get_kmem_cache(curr);
> + if (s == NULL) {
> + found = -1;
> + return 0;
... it cannot find a kmem_cache for the current task. This program is
run by bpf_prog_test_run_opts() with BPF_F_TEST_RUN_ON_CPU. So I think
the curr should point a task_struct in a slab cache.
Am I missing something?
Thanks,
Namhyung
> + }
> +
> + name = bpf_map_lookup_elem(&slab_hash, &s);
> + if (name && !bpf_strncmp(name, 11, "task_struct"))
> + found = 1;
> + else
> + found = -2;
> +
> + return 0;
> +}
> --
> 2.46.1.824.gd892dcdcdd-goog
>
next prev parent reply other threads:[~2024-09-29 6:13 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-27 18:41 [RFC/PATCH bpf-next 0/3] bpf: Add kmem_cache iterator and kfunc (v2) Namhyung Kim
2024-09-27 18:41 ` [RFC/PATCH bpf-next 1/3] bpf: Add kmem_cache iterator Namhyung Kim
2024-09-29 17:04 ` Alexei Starovoitov
2024-09-30 2:08 ` Namhyung Kim
2024-10-01 18:23 ` Alexei Starovoitov
2024-09-27 18:41 ` [RFC/PATCH bpf-next 2/3] mm/bpf: Add bpf_get_kmem_cache() kfunc Namhyung Kim
2024-09-29 17:05 ` Alexei Starovoitov
2024-09-30 2:09 ` Namhyung Kim
2024-09-27 18:41 ` [RFC/PATCH bpf-next 3/3] selftests/bpf: Add a test for kmem_cache_iter Namhyung Kim
2024-09-29 6:13 ` Namhyung Kim [this message]
2024-09-29 14:27 ` Hyeonggon Yoo
2024-09-30 2:18 ` Namhyung Kim
2024-09-30 3:24 ` Hyeonggon Yoo
2024-09-30 4:33 ` Namhyung Kim
2024-09-30 17:48 ` Namhyung Kim
2024-09-29 17:00 ` [RFC/PATCH bpf-next 0/3] bpf: Add kmem_cache iterator and kfunc (v2) Alexei Starovoitov
2024-09-30 1:51 ` Namhyung Kim
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=ZvjwEH3QXkjUCu8Z@google.com \
--to=namhyung@kernel.org \
--cc=42.hyeyoo@gmail.com \
--cc=acme@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=cl@linux.com \
--cc=daniel@iogearbox.net \
--cc=eddyz87@gmail.com \
--cc=haoluo@google.com \
--cc=iamjoonsoo.kim@lge.com \
--cc=john.fastabend@gmail.com \
--cc=jolsa@kernel.org \
--cc=kpsingh@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=martin.lau@linux.dev \
--cc=penberg@kernel.org \
--cc=rientjes@google.com \
--cc=roman.gushchin@linux.dev \
--cc=sdf@fomichev.me \
--cc=song@kernel.org \
--cc=vbabka@suse.cz \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.