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 C4FA2C3ABDA for ; Tue, 20 May 2025 06:06:40 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 605C16B0098; Tue, 20 May 2025 02:06:40 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 5DD096B0099; Tue, 20 May 2025 02:06:40 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4F33A6B009A; Tue, 20 May 2025 02:06:40 -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 30C076B0098 for ; Tue, 20 May 2025 02:06:40 -0400 (EDT) Received: from smtpin01.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 961001403F8 for ; Tue, 20 May 2025 06:06:39 +0000 (UTC) X-FDA: 83462252118.01.DC905A8 Received: from mail-pf1-f175.google.com (mail-pf1-f175.google.com [209.85.210.175]) by imf01.hostedemail.com (Postfix) with ESMTP id B14B240009 for ; Tue, 20 May 2025 06:06:37 +0000 (UTC) Authentication-Results: imf01.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=eidZpI7l; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf01.hostedemail.com: domain of laoar.shao@gmail.com designates 209.85.210.175 as permitted sender) smtp.mailfrom=laoar.shao@gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1747721197; 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-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=+R/i6XORP4JHXXce5hw/20wRcCywtoWhALSIpSSgNY8=; b=q6WKYJPk5yEuHTYy6geRITn8yp08oIr5EVIHvQV/h7v0pruaP8TMrEfh1QHOKKqmXXMct+ VNCUsYvj++tOv7gSsmc7pr8+0EkoDWQaCeZOkhMpnCoMYtgG5ibAAzPbgOU6hNd/NoIoPU vkd/b/nFTNIjcoWqT82ND//Hm8N4Ycw= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1747721197; a=rsa-sha256; cv=none; b=uVIKdFFEUb4HTtqREOp9l5m9/0fQl/ERzgQdZjUPBcu3ZAGDE7TLt3NW+Y7mbFjeIo6DFJ 8Bts+oDWofRH0g3uiJs1lH16v0xYyD2FmrZhA1UqgVOuVmxNeKZyN+3NfBvnUX0JOKZu9v e+mTCS1MU+cpKY+5luDTMhq3STnZFo0= ARC-Authentication-Results: i=1; imf01.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=eidZpI7l; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf01.hostedemail.com: domain of laoar.shao@gmail.com designates 209.85.210.175 as permitted sender) smtp.mailfrom=laoar.shao@gmail.com Received: by mail-pf1-f175.google.com with SMTP id d2e1a72fcca58-74264d1832eso6815876b3a.0 for ; Mon, 19 May 2025 23:06:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747721196; x=1748325996; darn=kvack.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=+R/i6XORP4JHXXce5hw/20wRcCywtoWhALSIpSSgNY8=; b=eidZpI7liSuAc7vto4E6+sOyKYPq0iHF63QDrrgo3BUOBYA5KpXtv4GE51AASOSydK YE8Iup0yPl1ORyrNlWFWOWQBcInr6jVEA7s9ypNRkPJWsD+VKUmyun3F99GCr149/0H7 cuQAoMMyVeBRIgCnB4Cd4gppxvinYBxq8vhdDSbemjM3smeAI7/bC8/8a6lpdydqMtAg xbbsvwLojzCs3cybxG4U7/X/BfpnzvJx66qMc6XtVntnbXAFmQeawGspEMbKF3Eg2BEp X9jp/ctK6OBaRdNo9MUJEemwM0lroaixyncgdAzx+7/aRY9qVfEUGtw96R1MMsySyTYY efWg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747721196; x=1748325996; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=+R/i6XORP4JHXXce5hw/20wRcCywtoWhALSIpSSgNY8=; b=giqA8ePo2lsPPQopEt+HNu95C7+kp+2JARquu1Pz4rY6OO9ERQKugijreUWUsw6gJq ldvnf781xoHzOt4fgMfuNkj7t+YKHJpv3vyqoNARm2T8znncZ9NePw8YUKUls4niHQ9U pu8Bxd/S16UpZwgO+EHibq1bdPOPfKwWPaOr6KAMEoiiGn/v9q5sMhxVnTyUqp+6lntt shjsXMKDhhzCEk3DdzJqXi9IWmmex5qsxc6CDY+GCmOjmGGbktrCJtA/D0Qp2oJaWbPP SnVR7P+s+yI3mXOMkvzFH8Ntp38or4q5OqNsAz0ACa6i3EPirNrpfmmBbIP17BsypLea nuNA== X-Forwarded-Encrypted: i=1; AJvYcCV1v4YgVWYJjo6v75OocRE76avq47D+GLth5GdBanbOyjR4AZB6xW3Rww7X4RiSZAsmUU8TXUP5QA==@kvack.org X-Gm-Message-State: AOJu0YyXGRioPympxoE4XZS/gVVmhrsXd3NIFrmXVn3xjR/NKqUqqFXD S9X1sWM2bcJxVUHsnxYqzqgeqz4KEW+T9apKrEoYOSON/iAHidaQ9jezsPJ/jT3U X-Gm-Gg: ASbGncs/4pNZ8SRGJuhXI6pbj05YDn4m4ll+yHh+uMELPelDMEDyuiq4DYV8bimQbli UMOfI612MzBlG+j7szsKxhf0E17XgK4BWYyzx/W26BjbSVpxIo/56rDwwPYAa0JqjUvPLqr1iej GKOlN41L7ZIzQPPCdtpPC+YFff+Ihhs99UgBCSBxCXS/o7hcYJLdJWcCrf41tsGGsznFh3fAAwm ZhHf7iF3EGqLCmPJRyhCyrKnIOPal9CGypIWWnte6HnKsoUm7YdQj0dGmwpXPeTv9igUzaLKISq 4HgmYM1fgOJhY2yKtF7VRIRAefxbG4OTBGLm/MtNgX9fdMxm0BuRQaW52iTXgPUp+xeWAdWQizQ s+dod1ADwuw== X-Google-Smtp-Source: AGHT+IE2rBbZvH4irE/20NJlvaM3UDbLqDjYTZCkVzQCmBeAMxjUOuRhmrpPMwxQw/CjLKcvbCgkWw== X-Received: by 2002:a05:6a20:7f8c:b0:203:bb3b:5f1d with SMTP id adf61e73a8af0-21621882888mr24979864637.6.1747721196460; Mon, 19 May 2025 23:06:36 -0700 (PDT) Received: from localhost.localdomain ([39.144.103.61]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-30f36385e91sm823428a91.12.2025.05.19.23.06.28 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 19 May 2025 23:06:35 -0700 (PDT) From: Yafang Shao To: akpm@linux-foundation.org, david@redhat.com, ziy@nvidia.com, baolin.wang@linux.alibaba.com, lorenzo.stoakes@oracle.com, Liam.Howlett@oracle.com, npache@redhat.com, ryan.roberts@arm.com, dev.jain@arm.com, hannes@cmpxchg.org, usamaarif642@gmail.com, gutierrez.asier@huawei-partners.com, willy@infradead.org, ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org Cc: bpf@vger.kernel.org, linux-mm@kvack.org, Yafang Shao Subject: [RFC PATCH v2 5/5] selftests/bpf: Add selftest for THP adjustment Date: Tue, 20 May 2025 14:05:03 +0800 Message-Id: <20250520060504.20251-6-laoar.shao@gmail.com> X-Mailer: git-send-email 2.37.1 (Apple Git-137.1) In-Reply-To: <20250520060504.20251-1-laoar.shao@gmail.com> References: <20250520060504.20251-1-laoar.shao@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Stat-Signature: cmgxr4rkm4j5u9r5fj7fii6dhbwwmtoq X-Rspam-User: X-Rspamd-Server: rspam05 X-Rspamd-Queue-Id: B14B240009 X-HE-Tag: 1747721197-478684 X-HE-Meta: U2FsdGVkX1/0NDAmjYlPYdnPlI85mZPyVSChUpTeAmgD/f9en58+d/NWIvdNiiJK3PcI4UmYZXz8D8R8l8RBuKKhnMCnoeMGbbomLQKWBzLyNo9EicGFGYlpnDU3qlOjy3lTaniKgkd8Pdn0wCNTVeUiYAEg6VOSw/HW4/8Ws2mMRekJPkpUbSy/ZinOd7Ju0HqwdX1wITcZrMeaZihSEJSYU9noom8bTt6QNcvtWLeEJo9d3aGIi8gZXWYtWiES4/j9PDfs0ou88QHUrTBldsFCIHdTRaUvg692uc50VNLQx3WaAYM7YkuPyRyDU7jRgEhFGtu6bRoU7rqx603z6/pCgiW6e8En5YKncyjqp5bd4fGr/k3LtEJ79ijeB0ZZGicDdeVV5sC3vxLeP8RB4VkMFLFOcq9sr2paFRtzSdpIUqLkiF1kp2UU1aC/sO17jrycETyp39wHl+8fpnMu5hqoUKnDetgqsS1+lFWygkm07FqxxkiMGfQOfI2y9rvrNbfnYPXz9ynuptHTkumcUQaJT/s+JFgSMY45SRCdasjNZ9tfujVxJ2avoa7A9mzqYjTBZMVEawrKdNDYYwNQt2zTMwXXB6m60n9ZWzQ4gkdLXsuteSuKHvXB8TNvSSMyfETFVQBo7/Tl/1wNZO8+PKQapomXxoBbcfc3tlsiELydHssxKNmksgL2AT/EajJ9Rnu2c+e3jHVvYm/dzBvFxHijZuQxx2QinHmy9aq67K9ntgJe/dIy2rIRSb7BavPXrWdLWB7KfSIdUyuEwlWJpbdrslaZlQL+dWLtl2CydrfZCd+ySP+UaCeSyB+D4BVSP0S9oFgy+pOMYbuBM/v/VmYT/kfxdKUfOb/5wloWDnnTCocbzFvUOgxPu4UgFZ1Nk+DMm/2+AOsym7848pamsoxapq59fUSbxSfu2jZXUPhQ+KwSHDWb+MwNFqIL4+XCi8fdqXvRucGSQ3LIXkM NGSG2lnv SmyRZ7u5AWRXsmox9vMfKimgsT3fzic17NtLducrfMwlrWF4eUklSeAJiTteU5JibyaqgGvrQ0pt/CtsDzQD+mawFOGn3c5LwAoRWzcenr0X2xNyp7XAZvSkW3C6OP0c61mCetnGW49Nqj+aPsxiCkSZnAs7wolH+VED6rwYCF3Gb1JbuM/mKgoDJh+iF3nYT7eRe2Mao4FfcEJUXsEzojfRPQGg5Nss+5b2ZA/hlFk7YtEVPOELuOfXU++bm630SfPui+HcXb29kFISUsI2JyCRTKB6YehXJbXOHsSA0s//Tqyg7Ec8NlpQLU2fgd+6aYkhROrRrRgQ94qbiZd+R5w7iLLWlOP5PSVMM+kIfUM+RMNTVBd1N+UtMg1BmZte2mGObSDFP8XgpxkspQoIdHlTP/Qzwee8VjTMrOWAwBRl3DP74n3kZdBWI9QXbh9VFip+F+8Yda0gBvkY7jp/9D/9CyTQu/LqtnWaO 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: This test case uses a BPF program to enforce the following THP allocation policy: - Only the current task is permitted to allocate THP. - All other tasks are denied. The expected behavior: - Before the BPF prog is attached No tasks can allocate THP. - After the BPF prog is attached Only the current task can allocate THP. - Switch to "never" mode after the BPF prog is attached THP allocation is not allowed even for the current task. The result is as follows, $ ./test_progs --name="thp_adjust" #437 thp_adjust:OK Summary: 1/0 PASSED, 0 SKIPPED, 0 FAILED CONFIG_TRANSPARENT_HUGEPAGE=y is required for this test. Signed-off-by: Yafang Shao --- tools/testing/selftests/bpf/config | 1 + .../selftests/bpf/prog_tests/thp_adjust.c | 175 ++++++++++++++++++ .../selftests/bpf/progs/test_thp_adjust.c | 39 ++++ 3 files changed, 215 insertions(+) create mode 100644 tools/testing/selftests/bpf/prog_tests/thp_adjust.c create mode 100644 tools/testing/selftests/bpf/progs/test_thp_adjust.c diff --git a/tools/testing/selftests/bpf/config b/tools/testing/selftests/bpf/config index c378d5d07e02..bb8a8a9d77a2 100644 --- a/tools/testing/selftests/bpf/config +++ b/tools/testing/selftests/bpf/config @@ -113,3 +113,4 @@ CONFIG_XDP_SOCKETS=y CONFIG_XFRM_INTERFACE=y CONFIG_TCP_CONG_DCTCP=y CONFIG_TCP_CONG_BBR=y +CONFIG_TRANSPARENT_HUGEPAGE=y diff --git a/tools/testing/selftests/bpf/prog_tests/thp_adjust.c b/tools/testing/selftests/bpf/prog_tests/thp_adjust.c new file mode 100644 index 000000000000..6accd110d8ea --- /dev/null +++ b/tools/testing/selftests/bpf/prog_tests/thp_adjust.c @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include +#include +#include "test_thp_adjust.skel.h" + +#define LEN (4 * 1024 * 1024) /* 4MB */ +#define THP_ENABLED_PATH "/sys/kernel/mm/transparent_hugepage/enabled" +#define SMAPS_PATH "/proc/self/smaps" +#define ANON_HUGE_PAGES "AnonHugePages:" + +static char *thp_addr; +static char old_mode[32]; + +int thp_mode_save(void) +{ + const char *start, *end; + char buf[128]; + int fd, err; + size_t len; + + fd = open(THP_ENABLED_PATH, O_RDONLY); + if (fd == -1) + return -1; + + err = read(fd, buf, sizeof(buf) - 1); + if (err == -1) + goto close; + + start = strchr(buf, '['); + end = start ? strchr(start, ']') : NULL; + if (!start || !end || end <= start) { + err = -1; + goto close; + } + + len = end - start - 1; + if (len >= sizeof(old_mode)) + len = sizeof(old_mode) - 1; + strncpy(old_mode, start + 1, len); + old_mode[len] = '\0'; + +close: + close(fd); + return err; +} + +int thp_set(const char *desired_mode) +{ + int fd, err; + + fd = open(THP_ENABLED_PATH, O_RDWR); + if (fd == -1) + return -1; + + err = write(fd, desired_mode, strlen(desired_mode)); + close(fd); + return err; +} + +int thp_reset(void) +{ + int fd, err; + + fd = open(THP_ENABLED_PATH, O_WRONLY); + if (fd == -1) + return -1; + + err = write(fd, old_mode, strlen(old_mode)); + close(fd); + return err; +} + +int thp_alloc(void) +{ + int err, i; + + thp_addr = mmap(NULL, LEN, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); + if (thp_addr == MAP_FAILED) + return -1; + + err = madvise(thp_addr, LEN, MADV_HUGEPAGE); + if (err == -1) + goto unmap; + + for (i = 0; i < LEN; i += 4096) + thp_addr[i] = 1; + return 0; + +unmap: + munmap(thp_addr, LEN); + return -1; +} + +void thp_free(void) +{ + if (!thp_addr) + return; + munmap(thp_addr, LEN); +} + +void test_thp_adjust(void) +{ + struct bpf_link *fentry_link, *ops_link; + struct test_thp_adjust *skel; + int err, first_calls; + + if (!ASSERT_NEQ(thp_mode_save(), -1, "THP mode save")) + return; + if (!ASSERT_GE(thp_set("bpf"), 0, "THP mode set")) + return; + + skel = test_thp_adjust__open(); + if (!ASSERT_OK_PTR(skel, "open")) + goto thp_reset; + + skel->bss->target_pid = getpid(); + + err = test_thp_adjust__load(skel); + if (!ASSERT_OK(err, "load")) + goto destroy; + + fentry_link = bpf_program__attach_trace(skel->progs.thp_run); + if (!ASSERT_OK_PTR(fentry_link, "attach fentry")) + goto destroy; + + if (!ASSERT_NEQ(thp_alloc(), -1, "THP alloc")) + goto destroy; + + /* Before attaching struct_ops, THP won't be allocated. */ + if (!ASSERT_EQ(skel->bss->thp_calls, 0, "THP calls")) + goto thp_free; + + if (!ASSERT_EQ(skel->bss->thp_wrong_calls, 0, "THP calls")) + goto thp_free; + + thp_free(); + + ops_link = bpf_map__attach_struct_ops(skel->maps.thp); + if (!ASSERT_OK_PTR(ops_link, "attach struct_ops")) + goto destroy; + + if (!ASSERT_NEQ(thp_alloc(), -1, "THP alloc")) + goto destroy; + + /* After attaching struct_ops, THP will be allocated. */ + if (!ASSERT_GT(skel->bss->thp_calls, 0, "THP calls")) + goto thp_free; + + first_calls = skel->bss->thp_calls; + + if (!ASSERT_EQ(skel->bss->thp_wrong_calls, 0, "THP calls")) + goto thp_free; + + thp_free(); + + if (!ASSERT_GE(thp_set("never"), 0, "THP set")) + goto destroy; + + if (!ASSERT_NEQ(thp_alloc(), -1, "THP alloc")) + goto destroy; + + /* In "never" mode, THP won't be allocated even if the prog is attached. */ + if (!ASSERT_EQ(skel->bss->thp_calls, first_calls, "THP calls")) + goto thp_free; + + ASSERT_EQ(skel->bss->thp_wrong_calls, 0, "THP calls"); + +thp_free: + thp_free(); +destroy: + test_thp_adjust__destroy(skel); +thp_reset: + ASSERT_GE(thp_reset(), 0, "THP mode reset"); +} diff --git a/tools/testing/selftests/bpf/progs/test_thp_adjust.c b/tools/testing/selftests/bpf/progs/test_thp_adjust.c new file mode 100644 index 000000000000..69135380853c --- /dev/null +++ b/tools/testing/selftests/bpf/progs/test_thp_adjust.c @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include "vmlinux.h" +#include +#include + +char _license[] SEC("license") = "GPL"; + +int target_pid; +int thp_calls; +int thp_wrong_calls; + +SEC("fentry/do_huge_pmd_anonymous_page") +int BPF_PROG(thp_run) +{ + struct task_struct *current = bpf_get_current_task_btf(); + + if (current->pid == target_pid) + thp_calls++; + else + thp_wrong_calls++; + return 0; +} + +SEC("struct_ops/thp_bpf_allowable") +bool BPF_PROG(thp_bpf_allowable) +{ + struct task_struct *current = bpf_get_current_task_btf(); + + /* Permit the current task to allocate memory using THP. */ + if (current->pid == target_pid) + return true; + return false; +} + +SEC(".struct_ops.link") +struct bpf_thp_ops thp = { + .thp_bpf_allowable = (void *)thp_bpf_allowable, +}; -- 2.43.5