From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 35C45CF6495 for ; Sun, 29 Sep 2024 14:27:43 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 3E0D18D000F; Sun, 29 Sep 2024 10:27:42 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 38F728D000C; Sun, 29 Sep 2024 10:27:42 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 20A0F8D000F; Sun, 29 Sep 2024 10:27:42 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id D75338D000C for ; Sun, 29 Sep 2024 10:27:41 -0400 (EDT) Received: from smtpin18.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id 4F7381C694C for ; Sun, 29 Sep 2024 14:27:41 +0000 (UTC) X-FDA: 82618004322.18.A5687B1 Received: from mail-lf1-f48.google.com (mail-lf1-f48.google.com [209.85.167.48]) by imf10.hostedemail.com (Postfix) with ESMTP id 629D0C0006 for ; Sun, 29 Sep 2024 14:27:39 +0000 (UTC) Authentication-Results: imf10.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=CRxWr4oe; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf10.hostedemail.com: domain of 42.hyeyoo@gmail.com designates 209.85.167.48 as permitted sender) smtp.mailfrom=42.hyeyoo@gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1727620021; a=rsa-sha256; cv=none; b=Yskkc94UFQfAnc1+RPhYXKerAdALFVHvFTvPH7mbF1oHNA2TtYgCdsL1Z41+ldPzL5DzGQ dUi77hPKs52pzo2TpJDVn3dQjFpl+NX+Cs9v4X//KgThDFdZcoR2lyb3Wxn5Etpv24SsYi 9MgvZrYhw3pw1vCG3ELWTg2i/bx+fO8= ARC-Authentication-Results: i=1; imf10.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=CRxWr4oe; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf10.hostedemail.com: domain of 42.hyeyoo@gmail.com designates 209.85.167.48 as permitted sender) smtp.mailfrom=42.hyeyoo@gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1727620021; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=PtbvtThMcLfZP33DpBG5SmDf+10l0U9/1PhI2Q2GmeY=; b=Mch6D/rv52qibB7JSyb6U0rQhq5pJbj0Gep4ym26OCn8CUfYZFo+2R4fqEaYsAsRwcR6uD Dfn/WNbkKH/jwAJSf7TEgYR9VLH6XdJIe6IzOtma11w+9SZYygf2+0WNuM0XxsK35SFIIX 95iiDdyWwej8NC6WOokRpt2NqPmSKVA= Received: by mail-lf1-f48.google.com with SMTP id 2adb3069b0e04-53991d05416so408990e87.2 for ; Sun, 29 Sep 2024 07:27:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1727620057; x=1728224857; darn=kvack.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=PtbvtThMcLfZP33DpBG5SmDf+10l0U9/1PhI2Q2GmeY=; b=CRxWr4oepzLY8xYse4Y7DMCK/2wt2KEcuBhD8TsFfyjQPgPDCQ5KdyrEuzKcvp/rvl ZwpvbbBIhRDXKIKmZ/wV3IW9ucjtIB1xNawGcOvqpMUo6CQCyJpfyFgaavf8Mjq5kVtF 5cm1id9MISyqi/RudCVR5U0P5NaMfn3tit9QlTW8gJqhGx3Gz2cQy12TCNOFDzNwXEb/ TjWoP1IgEQJipLe/3aSBem9GtBYUMLXVpQKO+haTHdeZVOUspbB8a6zeB/9+w3HLfRMJ kt1NdUG7I8vBy0CkfOR7DpDvGDSof/JHtFYvJo/2jLBCyQ1di9wjN7EdyLXv3DQg+NsV fvQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1727620057; x=1728224857; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=PtbvtThMcLfZP33DpBG5SmDf+10l0U9/1PhI2Q2GmeY=; b=QO7rdbWpkdKnEYxUENf4xeUl7XPVWSBOTbPOM0VD935FMFtqzvdiKbXy8VXxuzw5OX NRqvLmJ5Y/tJHanIb6ZkwnTG5V0ksTYGTh5DCO8d0AN+0do8v6qNX2z+9k3BZxIg2IBi vZglvz9NZ8dapOXd6O5W3/+74v9ZHFndR7AUieHZs1y4jagooHJIRDfb03HGwukUlYQl bvoyI8sAAY7iEDgPtamWTE4kmqXlFGT3UJExUiAQ1nh8wdHYfgMwyrzi4W86qhv5K/HT fFeCMMuVMdTMDBjJZ5qK6DLnzYrOrLH44Cmv7lUOGd2Mq4CHYKX69sYYg+K/PsvHtcf4 vjTw== X-Forwarded-Encrypted: i=1; AJvYcCU0J5UGfjK7FWd6G3VTkD+wVC8Bb2S4PFM8DRDgVXuJ9o9IItVD4ONR+hT4PkcFTWSrm9lecor5sg==@kvack.org X-Gm-Message-State: AOJu0YxhJhGCPgnuD9QKPD5alP/rXDdZhc+KTgryBXluvH1o8G/D/fqs BnqQ8tZPzNNAjk90dcYvlZLV97yHZ+ksCiXwFs7zHmiXTOuqabfU99M+Irv7nyL5ewPlHE+jTRJ SCP16MfQ9Np9UF1yCaWFhHrqMvOg= X-Google-Smtp-Source: AGHT+IE4HXL1kMylcq8xlFLuKWk1AaVJJnQaLup27Jz1RzB4cQGJRzdsAibNxQ6jhUjn45Faqm6I6zWP+QcmF9XJ9G8= X-Received: by 2002:a05:6512:220a:b0:539:9155:e8c1 with SMTP id 2adb3069b0e04-5399155ebcbmr836865e87.8.1727620057141; Sun, 29 Sep 2024 07:27:37 -0700 (PDT) MIME-Version: 1.0 References: <20240927184133.968283-1-namhyung@kernel.org> <20240927184133.968283-4-namhyung@kernel.org> In-Reply-To: From: Hyeonggon Yoo <42.hyeyoo@gmail.com> Date: Sun, 29 Sep 2024 23:27:25 +0900 Message-ID: Subject: Re: [RFC/PATCH bpf-next 3/3] selftests/bpf: Add a test for kmem_cache_iter To: Namhyung Kim Cc: Alexei Starovoitov , Daniel Borkmann , Andrii Nakryiko , Martin KaFai Lau , Eduard Zingerman , Song Liu , Yonghong Song , John Fastabend , KP Singh , Stanislav Fomichev , Hao Luo , Jiri Olsa , LKML , bpf@vger.kernel.org, Andrew Morton , Christoph Lameter , Pekka Enberg , David Rientjes , Joonsoo Kim , Vlastimil Babka , Roman Gushchin , linux-mm@kvack.org, Arnaldo Carvalho de Melo Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Rspam-User: X-Rspamd-Queue-Id: 629D0C0006 X-Rspamd-Server: rspam01 X-Stat-Signature: 3wfn13knu8xsaksyo7uousfm1q1fr77h X-HE-Tag: 1727620059-655885 X-HE-Meta: U2FsdGVkX1+3h02DqriUOjyJJqenABQeGYoLH5lXy6PvDUmjpd0gCfHZlawng4eB76JgYqV0LoC+0MoonRAZUxLEtVxqjiNEKhxO2x1BJTZe5BeaXt5t/u5Kh7K1ui1gpmMfCN8QPwfGZ1ojSDiZs4sIhnsJrklnIOUKbzM52wWbYQX2tnXzMPe2DOm4IlGcSz0wnV/M+eZeq0IOojvpx9vv/B+1bjf/XhYsL55Pa6jj0P2R1HHumnlnNNQGhV9MjwNBeovlqlyXXzOaX3ilkmI0AAkhjFcmMFqZ82TOT4YqFXJ49WvLTi1jK8PwhGdYfrbr7LC+Z6SCGHVPhFquNuBUZPE0jU9ThRgSAykES7P0fkJ3wEe4pUYqM87KSupYlmqgh2Edge+kheYE2kde0LdB6+oENEfRqpIyfgJhXYyDnLDoREmZU0Iy5SGCZoOV8wpCXIW+dQxcSXjCjwtotJZsHK8O79xMex/DvUwMpjlJh/oD1AljMNVIAia+fhgcjzDSGYGELl87xv/Kj1lurgRyd9sHzGP6dCEWhRv0+S9+kALMCP/VwobkhZ3vlxU2m1FxrbxWj/XJ2mqLeNWBzeh42pfjynRqXTwNmWM/63ZCW7KiHSe9vXuFdaGD8kkku985hM94Fy+SbjL5+nhB6k3tJweYfsbmy4KUREZ15Ox2ZebzTTNiVhFLOtFaUAWcBOwQ15ykRpQgu95R4iqKJ4WC8eh91LLdkVvZHCEKsgieBVk1kqpKzlkGne3C+GxLvEUurGiQoWSQe7/ItoVWNd9Apf35naR/peZP12LKuG8m9CHVJIay4gFraKXzBNyVYe/22pe4hpRuAXkOJj9jDifN+mCiHjXKx3V4yRAn2Lt7AXivmI+237oSD7JOGqbkDRcAg69t8JdwcNGgvPMosV5tlagzR+Z3uwlvou8RqvzHP2nM3QkjKp+d2FsyrSEL8yNu6KW5nR6HvcCW6td N88+Jtag HN4l/MXhohy8ip8w1A4zaD4Z4vymW5trvOcvJf+qInBSAK49Ec6tQveNxfJM4EqmZ5O4XEzgfKvIoCzeW0ETk2x4zS4A66y5rVEWoah9D0kQq0CrWAowbTmuPDqvGc83K7HpMGSPw3r7yPWzpzlmAwIoltTGKEwQIJQAt3Fl6GAoF8QIQLApSlBv37NWVdd4eFqeNUaNCeaiS7MSVRhx7AFx7685OLHtMUPohVmw96hsz9JN9dp8Lg+9q9zJzHUFOfOwBETuvvD8rmKQ4MRQNgb7YP5Ulhtz4I+/onr4U8YnHWFsMcYbDDIVESICpjojZPH1AtOFhZ1oSil7MkIQlBNUJef4zh7rE2Ll8e8akF3J44ViUy7iaY6hvEUNGArtDmCmDV4RyjZa8cArq1jsQkfm+dsVvtvLfxE901bWiDbp0G5NbT9zcAn+8Fte8WW+1rlayYyfoRM8CLvFiyXsUzf3rMEOU23azxG4euC8DPVYkjeychx3m81kz1w== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: On Sun, Sep 29, 2024 at 3:13=E2=80=AFPM Namhyung Kim = wrote: > > 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 > > --- > > .../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_i= ter.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 > > +#include > > +#include > > +#include "kmem_cache_iter.skel.h" > > + > > +static void test_kmem_cache_iter_check_task(struct kmem_cache_iter *sk= el) > > +{ > > + LIBBPF_OPTS(bpf_test_run_opts, opts, > > + .flags =3D BPF_F_TEST_RUN_ON_CPU, > > + ); > > + int prog_fd =3D 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 =3D NULL; > > + union bpf_iter_link_info linfo =3D {}; > > + struct bpf_link *link; > > + char buf[1024]; > > + int iter_fd; > > + > > + skel =3D kmem_cache_iter__open_and_load(); > > + if (!ASSERT_OK_PTR(skel, "kmem_cache_iter__open_and_load")) > > + return; > > + > > + opts.link_info =3D &linfo; > > + opts.link_info_len =3D sizeof(linfo); > > + > > + link =3D bpf_program__attach_iter(skel->progs.slab_info_collector= , &opts); > > + if (!ASSERT_OK_PTR(link, "attach_iter")) > > + goto destroy; > > + > > + iter_fd =3D 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/testi= ng/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/tool= s/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 > > +#include > > + > > +char _license[] SEC("license") =3D "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 =3D ctx->meta->seq; > > + struct kmem_cache *s =3D ctx->s; > > + > > + if (s) { > > + char name[SLAB_NAME_MAX]; > > + > > + /* > > + * To make sure if the slab_iter implements the seq inter= face > > + * 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 =3D bpf_get_current_task(); > > + struct kmem_cache *s; > > + char *name; > > + > > + s =3D bpf_get_kmem_cache(curr); > > + if (s =3D=3D NULL) { > > + found =3D -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? Hi Namhyung, Out of curiosity I've been investigating this issue on my machine and running some experiments. When the test fails, calling dump_page() for the page the task_struct belongs to, shows that the page does not have the PGTY_slab flag set which is why virt_to_slab(current) returns NULL. Does the test always fails on your environment? On my machine, the test passed sometimes but failed some times. Maybe sometimes the value returned by 'current' macro belongs to a slab, but sometimes it does not. But that doesn't really make sense to me as IIUC task_struct descriptors are allocated from slab. ....Or maybe some code can overwrote the page_type field of a slab? Hmm, it seems we need more information to identify what's gone wrong. Just FYI, adding the output of the following code snippet in bpf_get_kmem_cache(): pr_info("current =3D %llx\n", (unsigned long long)current); dump_page(virt_to_head_page(current), "virt_to_head_page()"); # When the test passes [ 232.755028] current =3D ffff8ff5b9ebd200 [ 232.755031] page: refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x139eb8 [ 232.755033] head: order:3 mapcount:0 entire_mapcount:0 nr_pages_mapped:0 pincount:0 [ 232.755035] memcg:ffff8ff5b3ee0c01 [ 232.755037] ksm flags: 0x17ffffc0000040(head|node=3D0|zone=3D2|lastcpupid=3D0x1fffff) [ 232.755040] page_type: f5(slab) [ 232.755042] raw: 0017ffffc0000040 ffff8ff58028ab00 ffffdaba05b8fc00 dead000000000003 [ 232.755045] raw: 0000000000000000 0000000000030003 00000001f5000000 ffff8ff5b3ee0c01 [ 232.755047] head: 0017ffffc0000040 ffff8ff58028ab00 ffffdaba05b8fc00 dead000000000003 [ 232.755048] head: 0000000000000000 0000000000030003 00000001f5000000 ffff8ff5b3ee0c01 [ 232.755050] head: 0017ffffc0000003 ffffdaba04e7ae01 ffffffffffffffff 0000000000000000 [ 232.755052] head: 0000000000000008 0000000000000000 00000000ffffffff 0000000000000000 [ 232.755053] page dumped because: virt_to_head_page() # When the test fails [ 130.811626] current =3D ffffffff884110c0 [ 130.811628] page: refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x8a9411 [ 130.811632] flags: 0x17ffffc0002000(reserved|node=3D0|zone=3D2|lastcpupid=3D0x1fffff) [ 130.811636] raw: 0017ffffc0002000 ffffdaba22a50448 ffffdaba22a50448 0000000000000000 [ 130.811639] raw: 0000000000000000 0000000000000000 00000001ffffffff 0000000000000000 [ 130.811641] page dumped because: virt_to_head_page() Best, Hyeonggon > > Thanks, > Namhyung > > > + } > > + > > + name =3D bpf_map_lookup_elem(&slab_hash, &s); > > + if (name && !bpf_strncmp(name, 11, "task_struct")) > > + found =3D 1; > > + else > > + found =3D -2; > > + > > + return 0; > > +} > > -- > > 2.46.1.824.gd892dcdcdd-goog > >