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 780F0C71157 for ; Sat, 21 Jun 2025 13:30:25 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id A9D836B007B; Sat, 21 Jun 2025 09:30:24 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id A4E726B0088; Sat, 21 Jun 2025 09:30:24 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 9645F6B0089; Sat, 21 Jun 2025 09:30:24 -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 8431B6B007B for ; Sat, 21 Jun 2025 09:30:24 -0400 (EDT) Received: from smtpin15.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 1433D100C30 for ; Sat, 21 Jun 2025 13:30:24 +0000 (UTC) X-FDA: 83579491968.15.0F219A2 Received: from mail-pg1-f181.google.com (mail-pg1-f181.google.com [209.85.215.181]) by imf19.hostedemail.com (Postfix) with ESMTP id 46AF41A0019 for ; Sat, 21 Jun 2025 13:30:22 +0000 (UTC) Authentication-Results: imf19.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=i3RDDvLn; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf19.hostedemail.com: domain of lianux.mm@gmail.com designates 209.85.215.181 as permitted sender) smtp.mailfrom=lianux.mm@gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1750512622; a=rsa-sha256; cv=none; b=OZ3E/Vk0SObTo8ff7rKfE2jdKRIy28IGwHcxXPNJIg/4J50UVGitEnAPID2EIFqtBqAdJX ReuFFDuIGenRVlstJnc5JwWaF1hKhlX/bDFjgOBXEU9rv/Z4yMFEJXMoVjkZj1i6XqfV45 DqJBxg1FP55yhcOOsjvtLzsJu+2TK3M= ARC-Authentication-Results: i=1; imf19.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=i3RDDvLn; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf19.hostedemail.com: domain of lianux.mm@gmail.com designates 209.85.215.181 as permitted sender) smtp.mailfrom=lianux.mm@gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1750512622; 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:references:dkim-signature; bh=ba6hvi5I10v0KDgTvmfI9Js/MJvGg3xuS26eE2n7BsE=; b=LEgD+svuKkGI+pJJXd/6/fBu6Y69AtELFWodjFJF4UVsdUmIPvsrp48lPFTS1fgcYXK7Ei uwQq6Df7+1tQsS/egSHIufUzyFVqtfjZeWSHRBVXyKxw8D1FZ1ihqqbN9B0QghdS/EW46e rBrJ8i3YaY7Klq4u+2bYbrQqI4sEpc4= Received: by mail-pg1-f181.google.com with SMTP id 41be03b00d2f7-b2f0faeb994so2899271a12.0 for ; Sat, 21 Jun 2025 06:30:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1750512621; x=1751117421; darn=kvack.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=ba6hvi5I10v0KDgTvmfI9Js/MJvGg3xuS26eE2n7BsE=; b=i3RDDvLnqNP/cIAZLhMvJjP8fkL1w/SQ7nOFaaS/BPdDLFaMnyAGhzG4nj9txCty2u shb/pME+fgTpGXq6HyH6K8IBJ1RvNgKg9gfZP7OPtbf5wO7DfqymjqMJ6r1qFxNnBste 8aqJ/MxwHYjrkzcTULMODEnfMFd7CcbV4slWskxCOJoYEaSHKTxPXHGNJ57hGgkjYHge gR+uV2XJUBexY7dDTHdUsJPWBSYdoF0zDrzs75wXkFntQygbl7v4ZlYqOxilzl+hAR41 miffKPF5684X8n2fNU1CO5bC/c7/3zI0oJRBzPcrfJ6rQgiNb0obCAlcKo9/UsA/Y0tV JhaQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750512621; x=1751117421; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=ba6hvi5I10v0KDgTvmfI9Js/MJvGg3xuS26eE2n7BsE=; b=Ez+WJ9pVK7W6HuDtT9MzsyxYxLL+L9V+l64TbIv8aax/WAc/35Yxw/RMUtCJFJg0bn DhsYb6NGW+zJSaaM5QUNqtVmn+1UrYbSc/m/1L+tWC7p8Fp1hhZMFypcZeqNKQZt52q5 f2rLbIyZSlvFyPU3x1GUA1Yos5hTd7vq/7WknrjqZyjHS1KREUE2lKSrR6BAro5gibep Ht6FHIvlGFl6rW35dOwpVUkpZ50zENL/WmG3lIDmJSJ6XO37QbKCikB9f0Auy2/Y41/m xcWw1k9Ipu2Y/PAjdbjryxrWanoEtLK18y1n5z5j63sevF5lPcP585YI/Ek148cufH4T OiLA== X-Forwarded-Encrypted: i=1; AJvYcCU4gPGOTCZMFAgB9NylLpnEnrv0Zmd0sN8QIg586vw4ll4gdPH55EeWD0Y8y3ucghX1nlZjWLyEaw==@kvack.org X-Gm-Message-State: AOJu0YxoMkQNc1Gk45c49wFnzx8VDgxoXLCBV3ZxoG62qDMgf+od/Tg4 FtzjHZ0F5/GZp4eaouQ3+E51BDwdYaeSxkJdMnrLG1El4q6F82+X/n/T X-Gm-Gg: ASbGncvBBAmV9DpeAdrMeNBcd67R/O2xndsEA+iO2ezcbH6yYU1qRkTS28Yc5GPrmEh nULK0IQ4liI0p3yyNkmTSGjKQbVslv9TWk/uzFDPUof4ojjAHnN/dusEK3UksYRvwnID3Q2HpRv sPQtUCXY3GHkFwH2WcmzFE1hzGAwJui4A4W2aYnssZDQWZQ6LPkosjoDp/BkD5C2xUGn/+SfA1C mTQHRzSuZBnzkmP3T/IGRfSB0l57P1lXhfEGx/MrZAxuZBIjSxR/K7lhJF3GiGraC0IbRfYtZyk dHfvz/Jt33snD4fELH6XfMKN2yY+ogoedBvCr3wVyFQoG3YSMMlIJRPkG+u9wHapespBANuR9rb lNOqpOA== X-Google-Smtp-Source: AGHT+IG5l0kSPJkR8H5fdLe5JFToPH93RCB/TbvmqIpTMVgRYpj+s57WMWDtsevqR00yq6oVHvWiyg== X-Received: by 2002:a17:90b:2703:b0:314:2a2e:9da9 with SMTP id 98e67ed59e1d1-3159d8d661fmr9165484a91.25.1750512620817; Sat, 21 Jun 2025 06:30:20 -0700 (PDT) Received: from DESKTOP-GIED850.localdomain ([111.202.167.6]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3158a23e6fbsm6527692a91.14.2025.06.21.06.30.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 21 Jun 2025 06:30:20 -0700 (PDT) From: wang lian To: Andrew Morton , Shuah Khan Cc: Christian Brauner , linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-kselftest@vger.kernel.org, SeongJae Park , zijing.zhang@proton.me, ryncsn@gmail.com, p1ucky0923@gmail.com, gkwang@linx-info.com, Lian Wang Subject: [PATCH] selftests/mm: add test for (BATCH_PROCESS)MADV_DONTNEED Date: Sat, 21 Jun 2025 21:30:03 +0800 Message-ID: <20250621133003.4733-1-lianux.mm@gmail.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Stat-Signature: 694tkmmdt7zmctnstppxaqjo68wcufbp X-Rspamd-Queue-Id: 46AF41A0019 X-Rspam-User: X-Rspamd-Server: rspam06 X-HE-Tag: 1750512622-822985 X-HE-Meta: U2FsdGVkX1/BFOKZuWFBobg/SdgC1OEVU0zzLqdJ3rG89AlYQIELK9beOKVA0zs212Wpd6VVJgbK/n9ZYANbBLY5d5OE4lC7nA4C3PWgiNjzkXbVX5lr9s/AwMJ1VwOFr+u6W/8gBdasaMXBUCP3o2N07k/x4g4WA7pOhiOJunpt50jhvqJNohURGL0QBHKisxsAYtnMnVXG3Gq1YrsSvIz9CZrhbH4oeedyoTGJXiGzmEwix3qPoOvGiJk47jeHrVD/77chX8Da2NfYnXSr0LqIM1r/snYStTe4QOmCpsOFe4Swp7L5moPv31Xg7Vr0A4e96+bMCiFt09oc+9muz+NLOa31zC+P1mKbe5mprx4sKecqIPgFPlJcruPbA+opEePiXSpJYj4NFTkbX34GJBhd6VjmAAWjWdb/zNSAbBmojd3HPUHQMlLrmhq1moK6X8OxtNYY4zJWOGG/tSM5EKUCPrLkYjtixOrNVUnMCQkbZXxgqnswptAgi7bPxwTjFaN9CVdWi7Gqp9+BHDSWrtr9F729+j5XyGKrZZKkwIkEEZj7Dpkv3M0oSEFXsXSv3q1kHuvLG54mq/fQxjE2fhJgHz0CH7Nc1CFw5OZ62Exx4+OwRp6FeyZg7NrrXwRQHasVgdPQyYBtK0dF/K09sS2kh6u6UgK6MGMxw/WPe4kIerftdV+sG32jTe+SCyYcwnWFW7aqWf7bG0hTz7cLA/Da0fJLswULZScudclwv+14NBehIH85xsYN9JeLDupFbl11pKY7IjkwNShHKOOZmlLaAnfzgKD21gvQtUgixta4qtRugju592pZdaqyx3M7xNLrPVabtRtbMyoppqkDD7WPZdNv7pGVyhHEi8cBFP39Ln3ccAaVpfMHWeJS/RbfZOmjkHygLnQYVjP3KwI1+xUyvg9tbPeHrlxcfqdM+ajRqFYUltUeun2QAVcH1+/VqXw1xQPdNo7g2z5y+uq LSDo95ZY 0EE6igdSQchF2SsMkv0N+K5Z0EBvE2RgvURfZlIPnUlTlsBcK4DBXHrlMNhkWeNLq/cw+Nr9U6zzPmsdji6jEOMbWg2d2AcYIqz9PKOboUAq/emjtmMOZH2itsCCHhrI8+EOd93bDv/XDY1pBvFFoytguaziSaINWPTcjqxnoq0MLP5tHUbOG1awuQ0R4ZN81BQ31HWLh877U2I9t5mPMzzaLRTpiwVLQBtZsp4LkYhs0NdXvVXXfhf/+RAzHWP4keymhB7p5FpA607FnCDxlS0rfT0YZ/sdV3KT14HB2O91QljXI5BxaSn8oPFccI1IfDlpAFp0+vDhja5v3/p2UUGuSMNiqncB8z9MViOEEkLl0fdjeWLWyGkaZ4aSaZ3rAUm1xaZW6m/O07q4GcMy5HvrpRHy+oenLe8u02WyxaOL8Oyx8rROx75usGCIQtwYAQMJhFp8q5X5U8Jj6IfrZsiiT8hI+7SnKQ7EayZd177z0zylWGh7a1VY2pwni6umhvEG9TcdHWO3slJyHVLM8IrMilFOI/GxfOykojrUvhG8pFFk= 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: From: Lian Wang Let's add a simple test for MADV_DONTNEED and PROCESS_MADV_DONTNEED, and inspired by SeongJae Park's test at GitHub[1] add batch test for PROCESS_MADV_DONTNEED,but for now it influence by workload and need add some race conditions test.We can add it later. Signed-off-by: Lian Wang References ========== [1] https://github.com/sjp38/eval_proc_madvise --- tools/testing/selftests/mm/.gitignore | 1 + tools/testing/selftests/mm/Makefile | 1 + tools/testing/selftests/mm/madv_dontneed.c | 220 +++++++++++++++++++++ tools/testing/selftests/mm/run_vmtests.sh | 5 + 4 files changed, 227 insertions(+) create mode 100644 tools/testing/selftests/mm/madv_dontneed.c diff --git a/tools/testing/selftests/mm/.gitignore b/tools/testing/selftests/mm/.gitignore index 824266982aa3..911f39d634be 100644 --- a/tools/testing/selftests/mm/.gitignore +++ b/tools/testing/selftests/mm/.gitignore @@ -25,6 +25,7 @@ pfnmap protection_keys protection_keys_32 protection_keys_64 +madv_dontneed madv_populate uffd-stress uffd-unit-tests diff --git a/tools/testing/selftests/mm/Makefile b/tools/testing/selftests/mm/Makefile index ae6f994d3add..2352252f3914 100644 --- a/tools/testing/selftests/mm/Makefile +++ b/tools/testing/selftests/mm/Makefile @@ -67,6 +67,7 @@ TEST_GEN_FILES += hugepage-mremap TEST_GEN_FILES += hugepage-shm TEST_GEN_FILES += hugepage-vmemmap TEST_GEN_FILES += khugepaged +TEST_GEN_FILES += madv_dontneed TEST_GEN_FILES += madv_populate TEST_GEN_FILES += map_fixed_noreplace TEST_GEN_FILES += map_hugetlb diff --git a/tools/testing/selftests/mm/madv_dontneed.c b/tools/testing/selftests/mm/madv_dontneed.c new file mode 100644 index 000000000000..b88444da7f9e --- /dev/null +++ b/tools/testing/selftests/mm/madv_dontneed.c @@ -0,0 +1,220 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * MADV_DONTNEED and PROCESS_MADV_DONTNEED tests + * + * Copyright (C) 2025, Linx Software Corp. + * + * Author(s): Lian Wang + */ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "vm_util.h" +#include + +#include "../kselftest.h" + +/* + * For now, we're using 2 MiB of private anonymous memory for all tests. + */ +#define SIZE (256 * 1024 * 1024) + +static size_t pagesize; + +static void sense_support(void) +{ + char *addr; + int ret; + + addr = mmap(0, pagesize, PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE, 0, 0); + if (!addr) + ksft_exit_fail_msg("mmap failed\n"); + + ret = madvise(addr, pagesize, MADV_DONTNEED); + if (ret) + ksft_exit_skip("MADV_DONTNEED is not available\n"); + + munmap(addr, pagesize); +} + +/* + * Read pagemap to check page is present in mermory + */ +static bool is_page_present(void *addr) +{ + uintptr_t vaddr = (uintptr_t)addr; + uintptr_t offset = (vaddr / pagesize) * sizeof(uint64_t); + ssize_t bytes_read; + uint64_t entry; + bool ret; + int fd; + + fd = open("/proc/self/pagemap", O_RDONLY); + if (fd < 0) { + ksft_exit_fail_msg("opening pagemap failed\n"); + ret = false; + } + + if ((lseek(fd, offset, SEEK_SET)) == -1) { + close(fd); + ret = false; + } + + bytes_read = read(fd, &entry, sizeof(entry)); + close(fd); + + if (bytes_read != sizeof(entry)) { + perror("read failed"); + return false; + } + + if (entry & (1ULL << 63)) + ret = true; + + return ret; +} + +/* + * test madvsise_dontneed + */ +static void test_madv_dontneed(void) +{ + unsigned long rss_anon_before, rss_anon_after; + bool present, rss; + char *addr; + int ret; + + ksft_print_msg("[RUN] %s\n", __func__); + + addr = mmap(0, SIZE, PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE, 0, 0); + if (!addr) + ksft_exit_fail_msg("mmap failed\n"); + + memset(addr, 0x7A, SIZE); + + rss_anon_before = rss_anon(); + if (!rss_anon_before) + ksft_exit_fail_msg("No RssAnon is allocated before dontneed\n"); + ret = madvise(addr, SIZE, MADV_DONTNEED); + ksft_test_result(!ret, "MADV_DONTNEED\n"); + + rss_anon_after = rss_anon(); + if (rss_anon_after < rss_anon_before) + rss = true; + ksft_test_result(rss, "MADV_DONTNEED rss is correct\n"); + + for (size_t i = 0; i < SIZE; i += pagesize) { + present = is_page_present(addr + i); + if (present) { + ksft_print_msg("Page not zero at offset %zu\n", + (size_t)i); + } + } + + ksft_test_result(!present, "MADV_DONTNEED page is present\n"); + munmap(addr, SIZE); +} + +/* + * Measure performance of batched process_madvise vs madvise + */ +static int measure_process_madvise_batching(int hint, int total_size, + int single_unit, int batch_size) +{ + struct iovec *vec = malloc(sizeof(*vec) * batch_size); + struct timespec start, end; + unsigned long elapsed_ns = 0; + unsigned long nr_measures = 0; + pid_t pid = getpid(); + char *buf; + int pidfd; + + pidfd = syscall(SYS_pidfd_open, pid, 0); + if (pidfd == -1) { + perror("pidfd_open fail"); + return -1; + } + + buf = mmap(NULL, total_size, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (buf == MAP_FAILED) { + perror("mmap fail"); + goto out; + } + + if (!vec) { + perror("malloc vec failed"); + goto unmap_out; + } + + while (elapsed_ns < 5UL * 1000 * 1000 * 1000) { + memset(buf, 0x7A, total_size); + + clock_gettime(CLOCK_MONOTONIC, &start); + + for (int off = 0; off < total_size; + off += single_unit * batch_size) { + for (int i = 0; i < batch_size; i++) { + vec[i].iov_base = buf + off + i * single_unit; + vec[i].iov_len = single_unit; + } + syscall(SYS_process_madvise, pidfd, vec, batch_size, + hint, 0); + } + + clock_gettime(CLOCK_MONOTONIC, &end); + elapsed_ns += (end.tv_sec - start.tv_sec) * 1e9 + + (end.tv_nsec - start.tv_nsec); + nr_measures++; + } + + ksft_print_msg("[RESULT] batch=%d time=%.3f us/op\n", batch_size, + (double)(elapsed_ns / nr_measures) / + (total_size / single_unit)); + + free(vec); +unmap_out: + munmap(buf, total_size); +out: + close(pidfd); + return 0; +} + +static void test_perf_batch_process(void) +{ + ksft_print_msg("[RUN] %s\n", __func__); + measure_process_madvise_batching(MADV_DONTNEED, SIZE, pagesize, 1); + measure_process_madvise_batching(MADV_DONTNEED, SIZE, pagesize, 2); + measure_process_madvise_batching(MADV_DONTNEED, SIZE, pagesize, 4); + ksft_test_result(1, "All test were done\n"); +} + +int main(int argc, char **argv) +{ + int err; + + pagesize = getpagesize(); + + ksft_print_header(); + ksft_set_plan(4); + + sense_support(); + test_madv_dontneed(); + test_perf_batch_process(); + + err = ksft_get_fail_cnt(); + if (err) + ksft_exit_fail_msg("%d out of %d tests failed\n", err, + ksft_test_num()); + ksft_exit_pass(); +} diff --git a/tools/testing/selftests/mm/run_vmtests.sh b/tools/testing/selftests/mm/run_vmtests.sh index dddd1dd8af14..f96d43153fc0 100755 --- a/tools/testing/selftests/mm/run_vmtests.sh +++ b/tools/testing/selftests/mm/run_vmtests.sh @@ -47,6 +47,8 @@ separated by spaces: hmm smoke tests - madv_guard test madvise(2) MADV_GUARD_INSTALL and MADV_GUARD_REMOVE options +- madv_dontneed + test memadvise(2) MADV_DONTNEED and PROCESS_MADV_DONTNEED options - madv_populate test memadvise(2) MADV_POPULATE_{READ,WRITE} options - memfd_secret @@ -422,6 +424,9 @@ CATEGORY="hmm" run_test bash ./test_hmm.sh smoke # MADV_GUARD_INSTALL and MADV_GUARD_REMOVE tests CATEGORY="madv_guard" run_test ./guard-regions +# MADV_DONTNEED and PROCESS_DONTNEED tests +CATEGORY="madv_dontneed" run_test ./madv_dontneed + # MADV_POPULATE_READ and MADV_POPULATE_WRITE tests CATEGORY="madv_populate" run_test ./madv_populate -- 2.43.0