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 3CDAEC5AD49 for ; Sun, 8 Jun 2025 07:36:37 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id CC4DE6B009A; Sun, 8 Jun 2025 03:36:36 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id C9C0A6B009B; Sun, 8 Jun 2025 03:36:36 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id B8B466B009C; Sun, 8 Jun 2025 03:36:36 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 9B08F6B009A for ; Sun, 8 Jun 2025 03:36:36 -0400 (EDT) Received: from smtpin07.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 4E339C0ED7 for ; Sun, 8 Jun 2025 07:36:36 +0000 (UTC) X-FDA: 83531425992.07.F4E914B Received: from mail-pj1-f42.google.com (mail-pj1-f42.google.com [209.85.216.42]) by imf02.hostedemail.com (Postfix) with ESMTP id 7101C80004 for ; Sun, 8 Jun 2025 07:36:34 +0000 (UTC) Authentication-Results: imf02.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=U9H9TVJX; spf=pass (imf02.hostedemail.com: domain of laoar.shao@gmail.com designates 209.85.216.42 as permitted sender) smtp.mailfrom=laoar.shao@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1749368194; 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=f9lEJCOWjCrNLanGPK9i8bcj5uBRqN1K5GYShhRAjFY=; b=i+j2mTIqEaCZQUQAGWgChc3yh4FOSeC/OHHHNHqQTWtv98spTXNGKij57GVwkHFvWoBCYo x8yfTHN1aWS7FdHLtxAmvrKyjpYfvZeAqPD1ilIzx4pehIL/FkyvnQFg52zKpgEEQIqEuS uGjZSXpfoNVPLRkCwcHDt19XVvAiM9Y= ARC-Authentication-Results: i=1; imf02.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=U9H9TVJX; spf=pass (imf02.hostedemail.com: domain of laoar.shao@gmail.com designates 209.85.216.42 as permitted sender) smtp.mailfrom=laoar.shao@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1749368194; a=rsa-sha256; cv=none; b=J7Hgq+foVZW3BjtjLTih0bgNU3+CDu/j40y4OUM2ZtPDkTPYOYm1IJ5gycKfeSjUppuIpd g0KocaCLNrxpA6jqcyMjDG3UZs4/7I/O4B7Gm1ly1Pj5mPF/JwN7mO9PabDkdTLkIDL3Vu FUOoZsvFQvQL3rIy49Q/wvAaczIH9O0= Received: by mail-pj1-f42.google.com with SMTP id 98e67ed59e1d1-3137c2021a0so268391a91.3 for ; Sun, 08 Jun 2025 00:36:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1749368193; x=1749972993; 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=f9lEJCOWjCrNLanGPK9i8bcj5uBRqN1K5GYShhRAjFY=; b=U9H9TVJXMPQgDaq+hepQHfyyKGmr1V6zxsAGlN+Lc0lpp52YsUpK3837ha4B9XRQzD F/tVMw8fXb1+q+chyGkoaGvru5HgnclJjZlAyKzB3kA0xp96As/T4ogpQjgbH3exJyLv s7psF9wvUolJ15A1LJKY1S3tz5M4ezY0p8N2ZM6iXD153RIgx13egIm4yVoCn2Gx7415 AZoW5gyw8UJ9+MA/kwcCY1NFReKlss1zpRBe/YOT1E6pczFzTY2PXAemIWmDVQdxDxDF RInu2V/pye+3icnSJEWPkaUfS4tTPCNowP84aZwe3MnNavT/SCZQmZs13yYqU6VBav51 9L+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749368193; x=1749972993; 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=f9lEJCOWjCrNLanGPK9i8bcj5uBRqN1K5GYShhRAjFY=; b=jvePQuLCzf4cZRReat6iRG0a8jQ+KgO9EXIzcrBQMpndwYsaOo8MduPYa3zhkx32wQ jfoC6uHskMkMidK4W/ae0VGYzxThIkoT/UR7es9AsrqHpEsbn+sWTO2GBV9y+e9/hpUo Kk+8kZmnrYvFgyBOF6Pv5EmUJxiSOPUG5tIuDo9SOumVojMuSMixYuuC3W3x/F0oco8W JNJ8flVHhaC4GQsswK6oBQYx92l5nZDQpL/i6iiXInlJj5u6N8qLVqD/7+hgRyZuu0z5 Ucwe5m1hOyaVbeC5dhevR49Z6qnKM4+5716oTqe8zYQEszNSnA/BW2G0TolZPR4qpCGe i4NQ== X-Forwarded-Encrypted: i=1; AJvYcCW0eFzcW/I2J4aMbrNEX2CjB5heDXXUT5PU5J7w/UJkBNKKxhmqzxw801VwEyKLiMymP1m+kLfmMw==@kvack.org X-Gm-Message-State: AOJu0YwIAl7TsjoSwMf5HpmHAmgaE0mlfFIRFfdwLGoQjTfjqsAeE6fr x6+zWDlev9I49AjYLosHCMPzisti+lXgkWtAIln0PNbb1N4mvKf08NEf X-Gm-Gg: ASbGncvP3Qnxx3SwmecSLhPI6fz/mnbEUUf6X/McJSMXC+Z585gUxZ65/6RJsoByRfu Xh3O33IPtXUNP7VI0PJ4jgn+R8t1UkYGBt1Pih0gexpnKUmYJ9PYuJSVKG451yHThdq90+Dx5h9 vhntvHtENidEIbMFefuaRfOfsbivSj+iP/WfTc1nGts9oQU7zWfoi4ohb+zeZDAkj05zj3yW/qQ H/q39JTUqfkaAC9Riz/w7iGRCT17x8cy0ZkSskCLVo5hpvJ4+4pJY0nONHCWNV+py9UKyNX5T2H AEoui5aOUG2oYnkTVfIsy8LQrK3YuTkn9Fd9L+eVMbDP3DIOiGMf4M+H7fC4l2i1vl3YsEcY/jQ = X-Google-Smtp-Source: AGHT+IH+roLvCwL0RLEOwGDdimU3DFVb+abEuCH4pjflLQlZie2hiEZ/+bR/mB7zOMXl8Ear6n6mFA== X-Received: by 2002:a17:90b:3503:b0:312:639:a06a with SMTP id 98e67ed59e1d1-313470738f1mr11748734a91.31.1749368193162; Sun, 08 Jun 2025 00:36:33 -0700 (PDT) Received: from localhost.localdomain ([39.144.124.91]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-236035069c3sm35968135ad.234.2025.06.08.00.36.24 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sun, 08 Jun 2025 00:36:32 -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 v3 5/5] selftests/bpf: Add selftest for THP adjustment Date: Sun, 8 Jun 2025 15:35:16 +0800 Message-Id: <20250608073516.22415-6-laoar.shao@gmail.com> X-Mailer: git-send-email 2.37.1 (Apple Git-137.1) In-Reply-To: <20250608073516.22415-1-laoar.shao@gmail.com> References: <20250608073516.22415-1-laoar.shao@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspamd-Server: rspam01 X-Rspamd-Queue-Id: 7101C80004 X-Stat-Signature: rzkzwmtfuourmwighweaqgzymuzj94bn X-Rspam-User: X-HE-Tag: 1749368194-699603 X-HE-Meta: U2FsdGVkX1+ObwT0Xzj59IygjDyGPxq7zQuTIXiij7S3cNn32qI4Uzeo7TIe93kHTNotF98SEOUUCdbFeaLJFXaz1XU21wxUG2+QkfdqtZ7kjk6N+30FvubWMkcH5fGWKzs+Niqc4JJpH9+Ay4aTj7WLMxLzTwE2/dowz8Ue5U0GzzSmK+tq/UYGtCHpWT/+IDRrLWO8iKiXYSpArWZarUJcM85femMQ6kt7YPWidAwpUcUsELa0LhMzZvs0axlpdlgBLH2/JCWAdr4GoogdS03sTX2drQOn4wyGKk5S/UQ4zXAvTRUodoDeD1+qZTJqY82hOOJ1BJ/+wmkO+YeW7BcOTll5+Bkd26njZRVu3ifM6AjppBZIWcQpSdNCa1sKeRfEo8QVuN/BHUtyU9NU4xkQaNk+ONglW1GdzpGpRf1Y5toS9iNou81tp4oQzcSqncn2AGWoMmFRt3toPkHny6boiXX/bWdkkIQ693y6NGo+0An3dXBA+Urc+V5BsXcKtNP5T+G3zLQMHPwlJiq6rZtNq4gh5scvzKRI8E2K3GKgcWVSWUDplrzjn+6ge7CNYogxnSLt2CmygQy+b2vTYebKK/7lRSH6OyUMlyn1JVJYzMBA7W+CqiOaOqaL6HT11g/BesROXQckYPJnDxf0AhooIZl9Z4DE3hdQkLmXVWkmlTbk+PcAnksKHb4FBk4+fT43WWcWn2aZ+U7Z4cUXmUlr402XN5rw+QKhAdR8Slge3alYM8W5I/auSGybc+j2qyoCFYblnsMpHC1ZZWyadTM2f8hfgzUwPNWxwYc4LbFqN7dVEEWXKEmMBydFSXgkXZEK12YTPJt0v6xFvZZEirzes0hWjP8JKH8I7ugDo7SyNUslH+sSh7HQWUe08zwVh2RpxCDRPqXnVJPRxhAsb5NS9uk/hb+6f6KWZJzXH10GWNqZVJUoiI7bLh2csH/jF6WMg1k8iLRwHgthsf7 zVZgfk6t lbA/347No5yGJMX3XadCsUe3nvabn4oSzqgsnDkV99yy6+kxEDwaBVZxEIANKW3dbK3/cVNAF3npTOFOPS7YpmxwpqxojjASe+bXF+0j2W7Ad826lYzkBuX5scCJf41KQPQQqJ7oxjcdf1TCuagLIad0CYI+7kXyrnw+Ho8rGvG08XNRrEpqjHAlwx1XIK4tjOW68CKGgTWnGLAWIEmfUT6J389BNKtHm2HbIbjbteJ/VlI+LEztwMsT5W5lgOYFqNOmgUofEWIWe+c7GywYdPGvEAysekbyGWjigeJQBxjI2d2cAiLk333LR0CO6KCgii3sUPkpaFiJeeLc9Q9lRl3hJ61s6XSRWuaYcojWDGrZuUqpipeaqkvyQPAVzm+5j6fnowBHmkVjJ3dVzpRKEfIoh2D5mX+sOcl1B4e6g3/kjz5e4PdBshnShrbBHyuNp077DybpTgyZuKo6aO27E+EHZnsje5mfd4Wlj 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: - Current task will wakeup khugepaged to allocate THP 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 | 158 ++++++++++++++++++ .../selftests/bpf/progs/test_thp_adjust.c | 38 +++++ 3 files changed, 197 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 f74e1ea0ad3b..1c3c44fd536d 100644 --- a/tools/testing/selftests/bpf/config +++ b/tools/testing/selftests/bpf/config @@ -118,3 +118,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..ee8a731f53d4 --- /dev/null +++ b/tools/testing/selftests/bpf/prog_tests/thp_adjust.c @@ -0,0 +1,158 @@ +// 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; + + for (i = 0; i < LEN; i += 4096) + thp_addr[i] = 1; + + err = madvise(thp_addr, LEN, MADV_HUGEPAGE); + if (err == -1) + goto unmap; + 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("madvise"), 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; + + 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->khugepaged_enter, 0, "khugepaged enter")) + goto thp_free; + + first_calls = skel->bss->khugepaged_enter; + + 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->khugepaged_enter, first_calls, "khugepaged enter")) + goto thp_free; + +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..9a3d8bfcd124 --- /dev/null +++ b/tools/testing/selftests/bpf/progs/test_thp_adjust.c @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include "vmlinux.h" +#include +#include + +char _license[] SEC("license") = "GPL"; + +#define THP_ALLOC_KHUGEPAGED (1<<1) + +int target_pid; +int khugepaged_enter; + +SEC("fentry/__khugepaged_enter") +int BPF_PROG(thp_run, struct mm_struct *mm) +{ + struct task_struct *current = bpf_get_current_task_btf(); + + if (current->mm == mm && current->pid == target_pid) + khugepaged_enter++; + return 0; +} + +SEC("struct_ops/allocator") +int BPF_PROG(bpf_thp_allocator) +{ + struct task_struct *current = bpf_get_current_task_btf(); + + /* Allocate THP for this task in khugepaged. */ + if (current->pid == target_pid) + return THP_ALLOC_KHUGEPAGED; + return 0; +} + +SEC(".struct_ops.link") +struct bpf_thp_ops thp = { + .allocator = (void *)bpf_thp_allocator, +}; -- 2.43.5