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 17CC9C3DA6D for ; Mon, 19 May 2025 22:33:58 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 7B9216B008C; Mon, 19 May 2025 18:33:56 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 769E86B0093; Mon, 19 May 2025 18:33:56 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 60A9D6B0095; Mon, 19 May 2025 18:33:56 -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 3A21E6B008C for ; Mon, 19 May 2025 18:33:56 -0400 (EDT) Received: from smtpin29.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 5A034141438 for ; Mon, 19 May 2025 22:33:55 +0000 (UTC) X-FDA: 83461111230.29.6325C3F Received: from mail-qt1-f180.google.com (mail-qt1-f180.google.com [209.85.160.180]) by imf04.hostedemail.com (Postfix) with ESMTP id 802F340005 for ; Mon, 19 May 2025 22:33:53 +0000 (UTC) Authentication-Results: imf04.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=YYVZcsTr; spf=pass (imf04.hostedemail.com: domain of usamaarif642@gmail.com designates 209.85.160.180 as permitted sender) smtp.mailfrom=usamaarif642@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=1747694033; 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=GLL6/TM7VHHA7BD7VtemxaiF2BY2WlisCLQAtLpyNFE=; b=aiqmvdJLfYIDGEWzmkhryDF6hmYQjAgHp52rUmfRIYgp6d/deJj0Szh4X7/+Bm47Jf/251 d2S9a39Ab3ond3qEGV0goGa2NH6d1dtoAcZWEryQE82PSL0HSNxCZZ0Ox90xO2T/xWzH7f Cx42nXD03SmC/rcLskMZtqyJrzb3KZ8= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1747694033; a=rsa-sha256; cv=none; b=dBgGVH7mzfZkIGzWNDfIZhBZfzGerICDBcTC16e45rfk3Gft7FLuTQErBXMUZooO2c/Z/1 jvGSPijnu494nm2r/dFGbvd01x9MhxP9DRuZtD2TPxnbwo0V3GLGqAiGwqRAEdXLVlqlx8 ffHbcg2AwFOzSR6sJqp/pBCC8z6RtEA= ARC-Authentication-Results: i=1; imf04.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=YYVZcsTr; spf=pass (imf04.hostedemail.com: domain of usamaarif642@gmail.com designates 209.85.160.180 as permitted sender) smtp.mailfrom=usamaarif642@gmail.com; dmarc=pass (policy=none) header.from=gmail.com Received: by mail-qt1-f180.google.com with SMTP id d75a77b69052e-47686580529so51999481cf.2 for ; Mon, 19 May 2025 15:33:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747694033; x=1748298833; 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=GLL6/TM7VHHA7BD7VtemxaiF2BY2WlisCLQAtLpyNFE=; b=YYVZcsTrqQk6jHzQusbm56roNRqKYWmTdrJnH/sc2g1Gx3xcW9IV7VJvC2Fut+VMOM f/68L6/VlHsf3lXXdkQVehjNYFSExMUIYxsLKuEZLeIf0YI5uj/olwFJFjhxncpW939l 6DF2//243z+2mqtFSQ+fkpi6B6oTkMb/nZqeUMue40NZDETsf7do6EAJcuSksvY0Resa zEmV7h6SJ1Enz+qxEy2bDh1URFdlsn/sMAL6IRtivv71Xk50qVsFIJd6N7aV6DSBN8Py xNNYyAd4F2sJVpz0vGHc+V6sTcuWY/97tyyTevWYJVb0Vy66YOV0XRmEAmefBWKKuMT7 K5KQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747694033; x=1748298833; 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=GLL6/TM7VHHA7BD7VtemxaiF2BY2WlisCLQAtLpyNFE=; b=DwUuRvFipCXulArU9VXlhrLJ0bBmK7euSY2143/F3rrkx/RhsSR6Hgv87PVGiBu+la p4WdvYZMZ9WFOsA7QoMH5ruMm34bF2IpKDST/xIOYq1JhOTA2XvfXeonD5fkrpqz7Uek vTpApEQPwP0xmlcB2CiGgghTMq6j8nq4tM9xc1xEBmY3/j/LjRGsZZ8ripbdddtnO59C DQTFfzyqfY5i8pnkAoAllvflk+9uI3oa7Klho9ARsMMJ6T1245bw+cVts4hEdLq90QFF LroeNMl1UMKFatMX6yDG8Q+4ZWzteurt6kvnMp55/W5p2mVFoG5UOb+taZ5GdAVUAJzG Rz/Q== X-Forwarded-Encrypted: i=1; AJvYcCWspWmQbWkIGcOy0dKz5iFPn9QhGKnjI4LATPOojOMoRE8mPemXeeRNTgFxh/MmCEAHPsLEsw2RTw==@kvack.org X-Gm-Message-State: AOJu0YwsqKEANfbDIgTa+0ry95Ahe7UXkl4p66Pk73X6YpucUl82+xXQ S/CWC+ZwepRl4SYaDjQi8ozgNwD229fe/Rk5rvABU9F7e0LUWygjUkUB X-Gm-Gg: ASbGncsxSAJ/fOi3hryVpwLUKrIdASuK52Z69clnmLZWBQvDqUcNgSa+aVTrofvunk/ orwDWjrRtibw8tDSMDbc0YDXEhZe7yWS7beiAVzUyxf5vyCOfyxk6HebJAIJxKJFleTBOs+gjlA MBKzLTWPYfY5lxxF1ApCsPwxQjBqMFXBsKej0m8E/M7B961s5vSwVhYEWS+Jr+m7qk8jk+VyUHE i/HEKG8YLBmtRaU/h2e3Mn2MGr/l5u2u4ktoEmoO+M2w9vCFxdxSZ7cw2sVE0X34arbO00MWURt jXc1uFno2xPRPO27z0G1xoKre5p5AOPYYPA2gmxAkFg9TrAb X-Google-Smtp-Source: AGHT+IF2bjSrNBKkDGo+548/O/GSqWphCFb2QYFAjC9c4/YfABn2yMXLMwEjhN7yIRg9vuRAbhk/TA== X-Received: by 2002:a05:622a:a1b:b0:476:a74d:f23b with SMTP id d75a77b69052e-494ae4ca3ffmr252876701cf.48.1747694032568; Mon, 19 May 2025 15:33:52 -0700 (PDT) Received: from localhost ([2a03:2880:20ff:1::]) by smtp.gmail.com with ESMTPSA id d75a77b69052e-494ae427fe5sm62947021cf.44.2025.05.19.15.33.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 19 May 2025 15:33:52 -0700 (PDT) From: Usama Arif To: Andrew Morton , david@redhat.com, linux-mm@kvack.org Cc: hannes@cmpxchg.org, shakeel.butt@linux.dev, riel@surriel.com, ziy@nvidia.com, laoar.shao@gmail.com, baolin.wang@linux.alibaba.com, lorenzo.stoakes@oracle.com, Liam.Howlett@oracle.com, npache@redhat.com, ryan.roberts@arm.com, vbabka@suse.cz, jannh@google.com, Arnd Bergmann , linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, kernel-team@meta.com, Usama Arif Subject: [PATCH v3 5/7] selftests: prctl: introduce tests for PR_DEFAULT_MADV_NOHUGEPAGE Date: Mon, 19 May 2025 23:29:57 +0100 Message-ID: <20250519223307.3601786-6-usamaarif642@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250519223307.3601786-1-usamaarif642@gmail.com> References: <20250519223307.3601786-1-usamaarif642@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspamd-Server: rspam08 X-Rspamd-Queue-Id: 802F340005 X-Stat-Signature: niqag8sc9ty6kd9a8p4sq8scwbnd1hqp X-Rspam-User: X-HE-Tag: 1747694033-807874 X-HE-Meta: U2FsdGVkX19a0jQg8l3l7nyyVqRCbmRRYjSHjhJcBIERrESjWpx7XK3TrYM3xvzSeraADB/eYS2x2+SBU28nlpkvxQokJ2QW41MZHRmO9n1E34MzWPu3WsKvm4U95p7aov9kEryvR8CoPk6jvIwge+dQ53KQy1at3J3wC3b8E356QRM6aI/tBcPwlm4wrr+8aV4WLAlxjg+HXWmwTtB5frK+0jtI93xhnSGWOH+kfCL38/aJj2OAbpDti/y7/W5G0Z+IMUsJSkC2noUISXcuMyEHHod7tC3cII0malpGSTBm25E0W6AFFEIj4y99YFq2jW1FdAQ15cWUMOpHF4uy+yJb4JTl2n4BATSRyH1PFzNOX2P6KjHdAMSn/qoJZs1zyvFBdTlRW7Okz68Y5oY4eB/TnCIliQRfPjPUFnRZaWJRmkQI9lZPi/Jw3ac8eOqP9leZI3OoAzGtJofhSgMHn75MO0xJXxH/jmoPJopc7O12CEkBLeir7Vw+IGr2+siodHIfw5BnyRLwMj01/jG5+POXBgexr/l8g70lPqxA/Hdhcnyna9/1Wbq0Cb0tGSIuZ5RkEkaDmuDbJjIh/pdAlsI4PTq9RyKNbF9RFX5/82wBrBP8xdQuGh+pg2lmo9fX+xCis5puMnCtCQm4mFrq8ihUFHM4YQ9NAA54tVmgQMxhlsRejbeEKUKd++RBBrelJ4CMNERWAyUXMWuMcYSHWI+6P45vQzk+eq/wD55VM7vnYe+TShwxnbxSmHbLV+lhAtGQHv3Fxd0ljxnh7l4X9ItZEug/Si+eBEurYfp7ReEqSBBYo1UMdA07yawn/Aw/FgEDPzGQA1Z4Jnvg++7z8EH7jyUqvRsd6AI8dAmOiA3NMXGC/DdDbrSJnRv5Gm+u+vinmKKgsOK8voxeLjrlXcJPtSrnh71fmVhOyeMZetVSax7YS31hjF1ooBXa2TTfz88fzq4QOuA0pueH6b1 l69AyQ6C z9EZ7M7wTlLppzOsf3zedA3HjglXxuisklJu8X/lXb2BQsrYC6Q5WhcJvToaNvjV6Dc04NmpOavwX296BX5dq9jJEa13IIB2gruwi6QtJl1kWdBbPiJu7zxulIfZ7etToqF6/8HIdYUEEx8o/66aW9DJKrRXlWU+87ncRoCjqwrqVE2YJyuLaqRBlqdArStV7AIOOaKAJ3jgtAk/EOk4DvgVq5MavTxFFMD8IQAes/B38yJ3c/aqtFEmb9x+PPQUjNQP6Vr14OYkDzRReEp8A3l5qkGrCGltpgPp+s/BvKFQGatOSicW/ZfGBjQQA6t/uBUVARvShyaoQ+nvBBoJYk7bbE7ny/mX5VUUCUgcqg2HRBKobsaONyL1w+23ymHpcFYgcsIXbDxeUzpVtBx2jFtdFuABQ162mlfTGrC8DyhMxq+wWA5Q2Y12eZ+X2kBNVTegi0taHfk8QLC57Vgr76gLgpxgXLbg79BDGdCffuUobEGD9Z2/idCRJ+Hdt01BQKu00gFJS+0W71yh7ZKBToqgsmQ7Q50E4WemHGqSPYhBsDsB0gK3vMzFt9QcEmpqOIB+DTRwQBkuyeWo= 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: The test is limited to 2M PMD THPs. It does not modify the system settings in order to not disturb other process running in the system. It checks if the PMD size is 2M, if the 2M policy is set to inherit and if the system global THP policy is set to "always", so that the change in behaviour due to PR_DEFAULT_MADV_NOHUGEPAGE can be seen. This tests if: - the process can successfully set the policy - carry it over to the new process with fork - if no hugepage is gotten when the process doesn't MADV_HUGEPAGE - if hugepage is gotten when the process does MADV_HUGEPAGE - the process can successfully reset the policy to PR_DEFAULT_SYSTEM - if hugepage is gotten after the policy reset Signed-off-by: Usama Arif --- tools/testing/selftests/prctl/Makefile | 2 +- tools/testing/selftests/prctl/thp_policy.c | 214 +++++++++++++++++++++ 2 files changed, 215 insertions(+), 1 deletion(-) create mode 100644 tools/testing/selftests/prctl/thp_policy.c diff --git a/tools/testing/selftests/prctl/Makefile b/tools/testing/selftests/prctl/Makefile index 01dc90fbb509..ee8c98e45b53 100644 --- a/tools/testing/selftests/prctl/Makefile +++ b/tools/testing/selftests/prctl/Makefile @@ -5,7 +5,7 @@ ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/x86/ -e s/x86_64/x86/) ifeq ($(ARCH),x86) TEST_PROGS := disable-tsc-ctxt-sw-stress-test disable-tsc-on-off-stress-test \ - disable-tsc-test set-anon-vma-name-test set-process-name + disable-tsc-test set-anon-vma-name-test set-process-name thp_policy all: $(TEST_PROGS) include ../lib.mk diff --git a/tools/testing/selftests/prctl/thp_policy.c b/tools/testing/selftests/prctl/thp_policy.c new file mode 100644 index 000000000000..7791d282f7c8 --- /dev/null +++ b/tools/testing/selftests/prctl/thp_policy.c @@ -0,0 +1,214 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * This test covers the PR_GET/SET_THP_POLICY functionality of prctl calls + */ +#include +#include +#include +#include +#include +#include +#include + +#ifndef PR_SET_THP_POLICY +#define PR_SET_THP_POLICY 78 +#define PR_GET_THP_POLICY 79 +#define PR_DEFAULT_MADV_HUGEPAGE 0 +#define PR_DEFAULT_MADV_NOHUGEPAGE 1 +#define PR_DEFAULT_SYSTEM 2 +#endif + +#define CONTENT_SIZE 256 +#define BUF_SIZE (12 * 2 * 1024 * 1024) // 12 x 2MB pages + +enum system_policy { + SYSTEM_POLICY_ALWAYS, + SYSTEM_POLICY_MADVISE, + SYSTEM_POLICY_NEVER, +}; + +int system_thp_policy; + +/* check if the sysfs file contains the expected substring */ +static int check_file_content(const char *file_path, const char *expected_substring) +{ + FILE *file = fopen(file_path, "r"); + char buffer[CONTENT_SIZE]; + + if (!file) { + perror("Failed to open file"); + return -1; + } + if (fgets(buffer, CONTENT_SIZE, file) == NULL) { + perror("Failed to read file"); + fclose(file); + return -1; + } + fclose(file); + // Remove newline character from the buffer + buffer[strcspn(buffer, "\n")] = '\0'; + if (strstr(buffer, expected_substring)) + return 0; + else + return 1; +} + +/* + * The test is designed for 2M hugepages only. + * Check if hugepage size is 2M, if 2M size inherits from global + * setting, and if the global setting is madvise or always. + */ +static int sysfs_check(void) +{ + int res = 0; + + res = check_file_content("/sys/kernel/mm/transparent_hugepage/hpage_pmd_size", "2097152"); + if (res) { + printf("hpage_pmd_size is not set to 2MB. Skipping test.\n"); + return -1; + } + res |= check_file_content("/sys/kernel/mm/transparent_hugepage/hugepages-2048kB/enabled", + "[inherit]"); + if (res) { + printf("hugepages-2048kB does not inherit global setting. Skipping test.\n"); + return -1; + } + + res = check_file_content("/sys/kernel/mm/transparent_hugepage/enabled", "[madvise]"); + if (!res) { + system_thp_policy = SYSTEM_POLICY_MADVISE; + return 0; + } + res = check_file_content("/sys/kernel/mm/transparent_hugepage/enabled", "[always]"); + if (!res) { + system_thp_policy = SYSTEM_POLICY_ALWAYS; + return 0; + } + printf("Global THP policy not set to madvise or always. Skipping test.\n"); + return -1; +} + +static int check_smaps_for_huge(void) +{ + FILE *file = fopen("/proc/self/smaps", "r"); + int is_anonhuge = 0; + char line[256]; + + if (!file) { + perror("fopen"); + return -1; + } + + while (fgets(line, sizeof(line), file)) { + if (strstr(line, "AnonHugePages:") && strstr(line, "24576 kB")) { + is_anonhuge = 1; + break; + } + } + fclose(file); + return is_anonhuge; +} + +static int test_mmap_thp(int madvise_buffer) +{ + int is_anonhuge; + + char *buffer = (char *)mmap(NULL, BUF_SIZE, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (buffer == MAP_FAILED) { + perror("mmap"); + return -1; + } + if (madvise_buffer) + madvise(buffer, BUF_SIZE, MADV_HUGEPAGE); + + // set memory to ensure it's allocated + memset(buffer, 0, BUF_SIZE); + is_anonhuge = check_smaps_for_huge(); + munmap(buffer, BUF_SIZE); + return is_anonhuge; +} + +/* Global policy is always, process is changed to NOHUGE (process becomes madvise) */ +static int test_global_always_process_nohuge(void) +{ + int is_anonhuge = 0, res = 0, status = 0; + pid_t pid; + + if (prctl(PR_SET_THP_POLICY, PR_DEFAULT_MADV_NOHUGEPAGE, NULL, NULL, NULL) != 0) { + perror("prctl failed to set policy to madvise"); + return -1; + } + + /* Make sure prctl changes are carried across fork */ + pid = fork(); + if (pid < 0) { + perror("fork"); + exit(EXIT_FAILURE); + } + + res = prctl(PR_GET_THP_POLICY, NULL, NULL, NULL, NULL); + if (res != PR_DEFAULT_MADV_NOHUGEPAGE) { + printf("prctl PR_GET_THP_POLICY returned %d pid %d\n", res, pid); + goto err_out; + } + + /* global = always, process = madvise, we shouldn't get HPs without madvise */ + is_anonhuge = test_mmap_thp(0); + if (is_anonhuge) { + printf( + "PR_DEFAULT_MADV_NOHUGEPAGE set but still got hugepages without MADV_HUGEPAGE\n"); + goto err_out; + } + + is_anonhuge = test_mmap_thp(1); + if (!is_anonhuge) { + printf( + "PR_DEFAULT_MADV_NOHUGEPAGE set but did't get hugepages with MADV_HUGEPAGE\n"); + goto err_out; + } + + /* Reset to system policy */ + if (prctl(PR_SET_THP_POLICY, PR_DEFAULT_SYSTEM, NULL, NULL, NULL) != 0) { + perror("prctl failed to set policy to system"); + goto err_out; + } + + is_anonhuge = test_mmap_thp(0); + if (!is_anonhuge) { + printf("global policy is always but we still didn't get hugepages\n"); + goto err_out; + } + + is_anonhuge = test_mmap_thp(1); + if (!is_anonhuge) { + printf("global policy is always but we still didn't get hugepages\n"); + goto err_out; + } + + if (pid == 0) { + exit(EXIT_SUCCESS); + } else { + wait(&status); + if (WIFEXITED(status)) + return 0; + else + return -1; + } + +err_out: + if (pid == 0) + exit(EXIT_FAILURE); + else + return -1; +} + +int main(void) +{ + if (sysfs_check()) + return 0; + + if (system_thp_policy == SYSTEM_POLICY_ALWAYS) + return test_global_always_process_nohuge(); + +} -- 2.47.1