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 7AFA8C369D9 for ; Tue, 29 Apr 2025 02:42:11 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 520436B0026; Mon, 28 Apr 2025 22:42:10 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 4CDFB6B0027; Mon, 28 Apr 2025 22:42:10 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 349236B0028; Mon, 28 Apr 2025 22:42:10 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id 144F26B0026 for ; Mon, 28 Apr 2025 22:42:10 -0400 (EDT) Received: from smtpin08.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id 665BDB6635 for ; Tue, 29 Apr 2025 02:42:10 +0000 (UTC) X-FDA: 83385532020.08.34F6221 Received: from mail-pg1-f173.google.com (mail-pg1-f173.google.com [209.85.215.173]) by imf25.hostedemail.com (Postfix) with ESMTP id 68C47A000C for ; Tue, 29 Apr 2025 02:42:08 +0000 (UTC) Authentication-Results: imf25.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=EZqpaool; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf25.hostedemail.com: domain of laoar.shao@gmail.com designates 209.85.215.173 as permitted sender) smtp.mailfrom=laoar.shao@gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1745894528; a=rsa-sha256; cv=none; b=x3/fr4cExcU8FV8eq4NHbl4D1n0mseBvdL66iQod9Kv6fKS1k2sR101A1JoNSoZQUgXuEh 6Pf67FFenVS+YewNjJYSkl+y+DbB/3NECtKVg34cWb2aHKd1frEVkoWAlQxSFY/xZ2TyfY qDkERS+U/raBy0XrLKOFhIErYl88IIY= ARC-Authentication-Results: i=1; imf25.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=EZqpaool; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf25.hostedemail.com: domain of laoar.shao@gmail.com designates 209.85.215.173 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=1745894528; 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=J3QG2CpnPlW2O8r0CXBDdTY9z46Ur2fJxVr7OR5m68k=; b=wSIbKx96Z9DN4q2VXMAVPFvOFJvrktGeastaLyb8WFTBGX3bzHkUDUP4uU85i3eiKHsuPi gkuB3veGHFsgW8LU5SK6U6vRX1wHYroYQBOcPgT6gMXHF3UFF3aNo8RXKfkzH6Tfc9YRGJ QawTb5fO26nCM1DDsiIsiUSWBEkPZtU= Received: by mail-pg1-f173.google.com with SMTP id 41be03b00d2f7-af548cb1f83so5635445a12.3 for ; Mon, 28 Apr 2025 19:42:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1745894527; x=1746499327; 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=J3QG2CpnPlW2O8r0CXBDdTY9z46Ur2fJxVr7OR5m68k=; b=EZqpaoollACDcdymtOSnx/EQATu18eyIPAdDd5BhgVDk1IXXd8o7McZZgS0DmpI5Fv kEggAnM6Dz26pVQrVNnSKZdIUhNm4KmolNybaAIOaOr/evxNaIJpKtnbMf8oGJ8eWhc4 0smGNBsbnlfri3BcDIjAeEpQpaz0sG65RE6FeLYLYIbqVoOANVwsMPauKJPbl/moU+Kl J7qVClrHH3L3o52PMT/cQLQCF3CnYxWn8lQRXkQUCZ0rlGgo1Oel8i/9KxF+4LuMtQnb BthpgQqj03G1Zha+pQfGTX/CMpPl5bJh+6mGP3uYe2/nscHP4Bxz6u0KxtUwPyvZHRvJ m0Kw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745894527; x=1746499327; 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=J3QG2CpnPlW2O8r0CXBDdTY9z46Ur2fJxVr7OR5m68k=; b=O/JGRad82nmJzi/eNBhILVrEjBLQ1N2PvxGasqcMrnJznZH7dkdOzRRfEBEg9SjdFs +ML/CPMqRfZ/+uZdreDsBiF+tk+ewt/1IIlG2OleNIvudhunC1JOKz1FpmC1Fd497Oui ESliQmuxdmFM+UpKfCy1a/a2QYGEgk0D2G7k+j36aPT4s0vUm2UOhm+UQCKlOkc+48f4 9QjMByOiIfqUUSE5S8TbJYjhzzKnQGit8EZqRoxpFa4Yoo+cYglE3iAL1zDwBHPoWL/m Xa8RyzHFgGYOVyHAvMagsIjEyKVku5AKRWXKjbj9E1KgzcU2D/dI9CXGiJb31Ek20IKQ cAyw== X-Forwarded-Encrypted: i=1; AJvYcCU/umiTFaCg76Q9kmhdMpP5DWQyHyXzh8Ibu0R9rMvVOJKVheMp6GN26jIwCKkshco6rKDP1s9Svw==@kvack.org X-Gm-Message-State: AOJu0YxWzP9/CDOH6hfekjq9QLqkBJN9Fbdg4i/uS9QD2+tTxU+4ekuC wAChTO/sPBvh/3ODCyPDbW2u46WTMt+xd2RvlziKKFE3LHXQHzn3 X-Gm-Gg: ASbGncuvuKwfD8gA6G7E0XoQmGceeXePfLIhYOHxtyl37DLWS7l9KdCjGBQjPF7YGbj 39rTC8Y0j65J7o4Z/Bw7hhahM38kpbvaQTq8y2EjkfXzWVZbwbtcXYfDT2dnW4aRek+lDKX89Ry CD5BX16x22wpl6OXQYX10XZKjZWlaNN18B3pRZNF8a+rrI3W0cCLjdYDXJ34ExX2vBk2r2FLgDk CDLk0w8+cxNE+lSXkiUIGJZwVattTT2RPpW8YGhYZCY8zdaPfpomDRyivA+Bcg3DFTBQxHPUuHv u6h/f8Aa2PQi1VhklKjz40n0Epu1VHjCrfGN+cJS9rkbc70vPQmV9Z6QcoXY498h9K62rHlA2+q q X-Google-Smtp-Source: AGHT+IEAPeUPVli4qWO5QlQ8d+cOcwqO5ztj8wQFajiMTD80rBatM9e7ukKG/Yqh5OXtnBM5KFGKnw== X-Received: by 2002:a17:902:d50c:b0:21f:1202:f2f5 with SMTP id d9443c01a7336-22dc69f83b7mr138676735ad.8.1745894527223; Mon, 28 Apr 2025 19:42:07 -0700 (PDT) Received: from localhost.localdomain ([39.144.106.153]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-309ef097cb7sm9893211a91.22.2025.04.28.19.42.03 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 28 Apr 2025 19:42:06 -0700 (PDT) From: Yafang Shao To: akpm@linux-foundation.org, ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org Cc: bpf@vger.kernel.org, linux-mm@kvack.org, Yafang Shao Subject: [RFC PATCH 4/4] selftests/bpf: Add selftest for THP adjustment Date: Tue, 29 Apr 2025 10:41:39 +0800 Message-Id: <20250429024139.34365-5-laoar.shao@gmail.com> X-Mailer: git-send-email 2.37.1 (Apple Git-137.1) In-Reply-To: <20250429024139.34365-1-laoar.shao@gmail.com> References: <20250429024139.34365-1-laoar.shao@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: 68C47A000C X-Rspam-User: X-Rspamd-Server: rspam07 X-Stat-Signature: 33adsa1r6oprtfqtwzyxjrxikgk6x3ey X-HE-Tag: 1745894528-779775 X-HE-Meta: U2FsdGVkX19LAw+K4wMh1GUISgVPBtYQSU+ERtLB84vgZJ6rsXdDeM/HRMMZTeCJrOETODwqZ4/Fm6hkt7k9hLRGT+b29KyQiSYz9wzc0RL5+aSHG0fVam5e5vJOLwINuIjIx0EXhz6cEA8DpDdrFCNLRp+oOeBv52YjwAabLVAVGAKLwtBFx74xeZmvHWREtHH9o4DDGLB0r+wVvHaM0r0C14fVWM6M6pZjG8bEhOjP6BZI3Oh7AT2LXJfo2+pX26LZYgrml+trK/9GNWDNqQV2zlzlE0RrE+1rTBEr4eoZqxtor2/Br1nYoK0T++sN3sznj6lAPEnOL2vnmMsQqG11BKN31Y9MV54xGNYNTrYzOnwrA5aURV0aeNBBexILTyNe9znd2ifH3Q+0mU00Lr0jLG9kI8X7jSYBEuld/Q+7RI32YPoHlWUVHbGAq7J5RwADPxMk6Yyz/+YjWcI3vC3B2H/s8CCa+86xAKUy6kbADn5PWzQPZWV40zj/Lhu32mgmKeH1o+FSiUEJNf3Npx4KO8dEtVA9Q7ahBwZonmrE13fbWvWAOiFH7op9LmlUJ6r9HdfCdmx8M9zhq4Rvk+AvO5cRD4xAebUE9vU+Uhm/29R6AheaxsLjYwjAssdfI0vQkZChdWRLMOyct1dgwh0HUfIvlpEjTvmwf/rIalsrATgiPW8EUinM4SeklikV7pDjHOYLzhLULwdYXvE11CcL+2JeZ7RaevSoKcMfgqeO89trqrssol4KAa9GlMjTZoqXS3884U2a3Jv2yqcaApup+ND+/lt6UDIAfjxgp/PttGZMjYFExwdrBAl8NX7oC+plwC5Q6q9/efz8DNqjQkHCrg8bczIVcw3RmGc0cMS9m61b8tkX2VUpwJXSmj7F/1jqENs1LewfCpM1+aRIxcDbKL7x0M6yQKUeHFI/kO6RAjRe03thUYKbVWdhxy11GYKnUgq9rHZAxE6NoyJ l4ADAc+g 5pImBdxOtPu8gqvWAlNBgEiffiddRW9CS5PO/YA0o2WeaOu1rgAniPTj2+QI1Sv5kOfZmvM/D65wyvauvSLF82OBZ/LQBkPJcrZXkBAqpfyiILJKphs3Fta2JWLFbYlaVLMLJMfgaj3GBnfv+hl5HaqOmdYhHzcArBlIPsoMV6BXiUwcLIACfbdc8ZPIOKb4FYhRU8ZHbL1deMZm08QIPVut9edRTPtjx4LwVufe/LSMdI3XkdvDdZ91d2NTAPiu710R5T42vFZoT6xvWgAv5CfWWTDOgJwvjZMGtv3NvB03qgMJSgRneAxoy+JeIHi4kI3yEM7yFl0GcrYWoSueLeMW/au72pXDTZ03rr4vpbMg3r5UDIC1gCIEKNlQ6syCrTaWL6KkDfFApmWemZoMm8hU+6Qkt0yMtkuVPcsi285YY13G/ncZFTn5LGxJbgz0M33ebBIQfhQJ5j1kRtveGuQr7Jd7cfBFg7tB+ 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: In this test case, we intentionally reject THP allocations via madvise(MADV_HUGEPAGE) when THP is configured in either 'madvise' or 'always' mode. To prevent spurious failures (e.g., due to insufficient memory for THP allocation), we deliberately omit testing the THP allocation path when the system is configured with THP 'never' mode. 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 | 176 ++++++++++++++++++ .../selftests/bpf/progs/test_thp_adjust.c | 32 ++++ 3 files changed, 209 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..bc307dac5bda --- /dev/null +++ b/tools/testing/selftests/bpf/prog_tests/thp_adjust.c @@ -0,0 +1,176 @@ +// 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 bool need_reset; +static char *thp_addr; + +int parse_thp_setting(const char *buf) +{ + const char *start = strchr(buf, '['); + const char *end = start ? strchr(start, ']') : NULL; + char setting[32] = {0}; + size_t len; + + if (!start || !end || end <= start) + return -1; + + len = end - start - 1; + if (len >= sizeof(setting)) + len = sizeof(setting) - 1; + + strncpy(setting, start + 1, len); + setting[len] = '\0'; + + if (strcmp(setting, "madvise") == 0 || strcmp(setting, "always") == 0) + return 0; + return 1; +} + +int thp_set(void) +{ + const char *desired_value = "madvise"; + char buf[32] = {0}; + int fd, err; + + fd = open(THP_ENABLED_PATH, O_RDWR); + if (fd == -1) + return -1; + + err = read(fd, buf, sizeof(buf) - 1); + if (err == -1) + goto close_fd; + + err = parse_thp_setting(buf); + if (err == -1 || err == 0) + goto close_fd; + + err = lseek(fd, 0, SEEK_SET); + if (err == -1) + goto close_fd; + + err = write(fd, desired_value, strlen(desired_value)); + if (err == -1) + goto close_fd; + need_reset = true; + +close_fd: + close(fd); + return err; +} + +int thp_reset(void) +{ + int fd, err; + + if (!need_reset) + return 0; + + fd = open(THP_ENABLED_PATH, O_WRONLY); + if (fd == -1) + return -1; + + err = write(fd, "never", strlen("never")); + 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); +} + +int thp_size(void) +{ + unsigned long total_kb = 0; + char *line, *saveptr; + ssize_t bytes_read; + char buf[4096]; + int fd; + + fd = open(SMAPS_PATH, O_RDONLY); + if (fd == -1) + return -1; + + while ((bytes_read = read(fd, buf, sizeof(buf) - 1)) > 0) { + buf[bytes_read] = '\0'; + line = strtok_r(buf, "\n", &saveptr); + while (line) { + if (strstr(line, ANON_HUGE_PAGES)) { + unsigned long kb; + + if (sscanf(line + strlen(ANON_HUGE_PAGES), "%lu", &kb) == 1) + total_kb += kb; + } + line = strtok_r(NULL, "\n", &saveptr); + } + } + + if (bytes_read == -1) + total_kb = -1; + + close(fd); + return total_kb; +} + +void test_thp_adjust(void) +{ + struct test_thp_adjust *skel; + int err; + + skel = test_thp_adjust__open(); + if (!ASSERT_OK_PTR(skel, "open")) + return; + + skel->bss->target_pid = getpid(); + + err = test_thp_adjust__load(skel); + if (!ASSERT_OK(err, "load")) + goto destroy; + + err = test_thp_adjust__attach(skel); + if (!ASSERT_OK(err, "attach")) + goto destroy; + + if (!ASSERT_NEQ(thp_set(), -1, "THP set")) + goto destroy; + if (!ASSERT_NEQ(thp_alloc(), -1, "THP alloc")) + goto thp_reset; + ASSERT_EQ(thp_size(), 0, "THP size"); + thp_free(); + +thp_reset: + ASSERT_NEQ(thp_reset(), -1, "THP reset"); +destroy: + test_thp_adjust__destroy(skel); +} 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..45026bba2c8d --- /dev/null +++ b/tools/testing/selftests/bpf/progs/test_thp_adjust.c @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include "vmlinux.h" +#include +#include + +char _license[] SEC("license") = "GPL"; + +#define MM_BPF_ALLOWABLE (1) +#define MM_BPF_NOT_ALLOWABLE (-1) + +int target_pid; + +SEC("fmod_ret/mm_bpf_thp_vma_allowable") +int BPF_PROG(thp_vma_allowable, struct vm_area_struct *vma) +{ + struct task_struct *p; + struct mm_struct *mm; + + if (!vma) + return 0; + + mm = vma->vm_mm; + if (!mm) + return 0; + + p = mm->owner; + /* The target task is not allowed to use THP. */ + if (p->pid == target_pid) + return MM_BPF_NOT_ALLOWABLE; + return 0; +} -- 2.43.5