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 26C5BC5B555 for ; Wed, 4 Jun 2025 08:22:04 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id B6CF86B049D; Wed, 4 Jun 2025 04:22:03 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id AF70B6B04A1; Wed, 4 Jun 2025 04:22:03 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 9E5DF6B04A2; Wed, 4 Jun 2025 04:22:03 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 85AD76B049D for ; Wed, 4 Jun 2025 04:22:03 -0400 (EDT) Received: from smtpin08.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id 3F63C80A8A for ; Wed, 4 Jun 2025 08:22:03 +0000 (UTC) X-FDA: 83517025326.08.23C4267 Received: from mail-ed1-f50.google.com (mail-ed1-f50.google.com [209.85.208.50]) by imf30.hostedemail.com (Postfix) with ESMTP id 4266B8000B for ; Wed, 4 Jun 2025 08:22:01 +0000 (UTC) Authentication-Results: imf30.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=cA4+IAnJ; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf30.hostedemail.com: domain of richard.weiyang@gmail.com designates 209.85.208.50 as permitted sender) smtp.mailfrom=richard.weiyang@gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1749025321; a=rsa-sha256; cv=none; b=ea3ZviaA01wJz7V5eVknsVnFxoNWgX4Qkv/E9St9UyIK76Lcty6xGPP5gKoyNLJ2aZ84bq WbV1LFU6iiMwh0JNNLALg9DMDEeKXY4Hzz+3tAhx8bIHDFB+b3MF9fSm1VrCfJ/MBSrt9g Bnn6DJ9ooQeraaVny6PBGmyLzlpAf1g= ARC-Authentication-Results: i=1; imf30.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=cA4+IAnJ; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf30.hostedemail.com: domain of richard.weiyang@gmail.com designates 209.85.208.50 as permitted sender) smtp.mailfrom=richard.weiyang@gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1749025321; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:in-reply-to: references:references:dkim-signature; bh=R1PmexcXDzfxPJBhbQk9JPwNkHWm4Mbz7NtLQ78OvBY=; b=b2cr0+pCW1cnu818d8ix6Dq7fyg0/Ga5yV7qB9kOpiAhLOQuFlwSQyqd6qt0K5dWhNyCEw l2PkYc+xVyo4Nl/55EM7PQukxPJ7sM1kgWNzgQvoyST9L69u1t6uG16wGhliH9+pUUBCZ2 p0HOJrEahiRommY2VLRnY4P/Dv9jg40= Received: by mail-ed1-f50.google.com with SMTP id 4fb4d7f45d1cf-60179d8e65fso2350725a12.0 for ; Wed, 04 Jun 2025 01:22:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1749025320; x=1749630120; darn=kvack.org; h=references:in-reply-to:message-id:date:subject:cc:to:from:from:to :cc:subject:date:message-id:reply-to; bh=R1PmexcXDzfxPJBhbQk9JPwNkHWm4Mbz7NtLQ78OvBY=; b=cA4+IAnJgINLjNE7KBKPUjh8o9Kxpj3tvqbtjb9eAJTnkzOawpj3VjloiRpZmUxYba jYNey32dSPqAZtLZxvkl+R0DAAvrJNA/v7/Th/vSiD13cqF7kr2JPfgr5Dm0p5iCLcBU TOUaTXpGPl/T4O29jaNaSbk7YP8YCpprlxej/LiOyTJcpRsnVzRPLp1hsU+C5iYfx+qA Zwshg+J3IctTVb2J2UBTj+JQUtrYpx7Xwgcyj+Oz8jwnBBHSyX2dibC68xUm6P7CqDzc O41PUKk6X+a0mSrHNV56mxrrrcpHzdb9CX47JAXG6WbwG7miFplFikRu3uusnxmnRrxm /Cww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749025320; x=1749630120; h=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=R1PmexcXDzfxPJBhbQk9JPwNkHWm4Mbz7NtLQ78OvBY=; b=nGL9GBXFkhQr5Zs9j5GMLUzqDFVsXM7StA1Y86FLQlog3WB/DZG/mvsEgtfYvQ7CER g+ZBx0us4FfxaWLAi/X8nSkkPU+vZDL7Ev0seNEaNTic0M5JIiHKwsGynpat6hmHunSe guOKfjxkWVJ2NBBgqKF6junBJzvsJofsA35oxQXR7wPj04l1Y/lOaavdmyuAaRdehwHz BpUAPdFN4lZs4yYLTLpl1n2HmKL6AJFIztTbbQHqW1juxzkzFvrWhaFZsG8Ih+UaHkhO dTmp8rXUlP7NHXZBTkngfYkpk7I3KS6sv8er30xOLJz0/WCNT+zgaTX2xxdFAc2XkdP3 BviA== X-Gm-Message-State: AOJu0YzRMicMM1Ab6KG/5PwLoAYj2m/ywLYBZOQjqu9P1oPtuEp3as+9 m8VwmY8B8IisF+H1hUfkCPctJYiNnGk0LcVbjdCHsEP5q4l9EwQGncqW X-Gm-Gg: ASbGncvGOEgzyuy5vsUZkMJ8gxx9EJrOqF/8Pco4dtgfyL5ndjI2eBLuzD2wdDJbHz/ 42vzd2pX362s5urLkld2OrGdNqeta/w/c83TQEmh8FtUfYf9AxBU/Zs9pPbxNEogBzCFjwWozmm m7cXlEQ2vcqS3WbTWN5MdusN+xK0vHABuUdHI4RR+d1mGnZb5/cBASrWQakNxE0AN77PPnXXp+q 6Y5rCRUVCynzM6T3l1KKtXWnJ14cQOQ/vNge0kbcJz6DBy0nrJy6myEfuvcnKzAQmAcnmbd+umN KqyobcFCM9s0CLDlbqlvqlJKULq9XV9LNsYIwJpV8WEHARDUoQ4= X-Google-Smtp-Source: AGHT+IHSvCuO1Ib+fkwk22wioZn8f1CDtoboyPFI3l6u+xFSp7f8Ju1U9l060wyNsCkc3W+4GkHqgw== X-Received: by 2002:a17:906:c110:b0:ad8:8478:6eb8 with SMTP id a640c23a62f3a-addf8c99acbmr142337366b.9.1749025319439; Wed, 04 Jun 2025 01:21:59 -0700 (PDT) Received: from localhost ([185.92.221.13]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ada5dd04586sm1075042366b.98.2025.06.04.01.21.58 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Wed, 04 Jun 2025 01:21:59 -0700 (PDT) From: Wei Yang To: akpm@linux-foundation.org, david@redhat.com, lorenzo.stoakes@oracle.com, riel@surriel.com, Liam.Howlett@oracle.com, vbabka@suse.cz, harry.yoo@oracle.com Cc: linux-mm@kvack.org, linux-kselftest@vger.kernel.org, Wei Yang Subject: [RFC Patch 1/2] selftests/mm: put general ksm operation into vm_util Date: Wed, 4 Jun 2025 08:21:44 +0000 Message-Id: <20250604082145.13800-2-richard.weiyang@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20250604082145.13800-1-richard.weiyang@gmail.com> References: <20250604082145.13800-1-richard.weiyang@gmail.com> X-Rspamd-Server: rspam08 X-Rspamd-Queue-Id: 4266B8000B X-Stat-Signature: g6rejkwijymserxhiy9qaec1jyerirx3 X-Rspam-User: X-HE-Tag: 1749025321-306428 X-HE-Meta: U2FsdGVkX1/61TVroibKzZy9nBvuHp5SgUbxj96lwNeaJIt5NXY5RzdE2BAOwz1uNj+5xiQaMjjOlG9Spox8POr816XIfscmNKtKqq2NYNhEIJJUTkVO3cnrZZ0/gxa3Wju/7Cb9HdYsglRV9kVPl+nGaVr34hLu5AFunKu5nclLAW8N2f6yu/0y2G/AJkWutgTJVEjrJDZrALhKby6VueoJlmHLrxQsVf+C18s50PlrwiJhBug6IsaGrd1lHu3C1Nj6HHRou0tETS3TUdFa16QuXjKSrKapn1fMXXUaSxPUCCc+tIZ+LyXXfucc93+Cx155eZCW7XUWyfsP+uluzJvdb8tbSo2A8eBNBrXJHSM3hs63OpeUTboG/zBd1aNNEjfiVDbJeyuiotX/Ney6YY08RBmnhQg+C/Z+rX92G8n3v4Z7nWRY1W1KA8hlwJ9u4bpF6vc9aGmN1Erxr0gVToBayRS2t8PIY0tEQKDNF58WmcAVq/yVVBsW+uPemq6Uf6dKYe4zuDnF7lzO+1qOwB+2Wv/Ui56NewCMGxUhEX2qXamHz2ph8xAvdjS2UcugGdGoX3daYfpr9dnfLlKbknfoSvJ7QJxf92pWVQij0nzuKRDQ+d0K/lQpiFeGUgrcoIVrsklWq1kNNKinp4CNoKuzGQwd5S2eVB+xtA2J/54a1DM+dXk2V89YHq4HxM13hB4YcYMK82pn8+NnkGI5ac5Q0TPM9/jZftBOeEUhGSWR4TwYBIhtt32oh8cwQdDJsqAsNVHmOMwxfSjw8oBvT3283D7781dYwREnZOsyZxg+nhEuMhoDmvVMuALdT1D7lxy47oS44zMbPUJUR0udc/AqOcH4PcHZE6pg2V5c9aYsDcfhhiSAnvaHbJgxHqiqu2Ur1SQGpcv8eqGhiBHnJc4k1914hBoGyCtuZ0Yat2hNZaiROBU68mvneoZdRBxIRdsXxwBoplvHC6oY9U3 2zJ5iUcF g5AbFe2FjPzzLA90ZuKxV+aTxBKZzWnyim5wZxsrArW0iES4sNYeRPODXI+kazdz2U0pJoJAobNQgDD1yOlH+kqCm67dGGlWuSh+jXNVPV3tGisQpZRs7oR5d1ddjIb9ZPsdUyzFuieA5nioQnbiZ2iV6e+mQZneErQyHMX5YQNBnqotmK3av4Yuig8M2k1Ppb722DeyIsk5h0G+S1EYRSNIU5iYxCB8v3TS6I65DipL7yANHnqDgNX/8z4nQpDYBVFlt7BftmAJeCeUC+V5HnjbSHlJ2jsOw2ygF7FFHspI3E3sFH/iuhxwExdeLSh/wdeSUzvoYSt+x+BGti59UtkU8+eyszYWjTVBHlyk2lQeP2C/bso32F2+3NT6j7n40pT2Jx4qWkDjxtb1cL5ZrjKra4Hb6zc2QMcT2uTrRH824eBF3y0PsuLiiclHnVUULAc2aOTapmqj+cmdCvAOKiCthe8DjLIYtoo4Qfmo11ReGlTLL5a81u8yJQSEOu65cwP4HwX3G3DRzX6TcrHoJtPw23I48KMbtQz12i2m7aqBfWx+9wLEVfrNkXMusV0M4QHXjP+j7cKkz0qIAyb304i7XDhMK6k2zlEpbmpk/79Vk3WqqLqYsSKoxRnmpgGno5KGH4/0vfs+rHco= 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: There are some general ksm operations could be used by other related test case. Put them into vm_util for common use. This is a preparation patch for later use. Signed-off-by: Wei Yang Suggested-by: David Hildenbrand Cc: David Hildenbrand Cc: Lorenzo Stoakes Cc: Rik van Riel Cc: Liam R. Howlett Cc: Vlastimil Babka Cc: Harry Yoo --- .../selftests/mm/ksm_functional_tests.c | 76 +++---------------- tools/testing/selftests/mm/vm_util.c | 71 +++++++++++++++++ tools/testing/selftests/mm/vm_util.h | 7 ++ 3 files changed, 88 insertions(+), 66 deletions(-) diff --git a/tools/testing/selftests/mm/ksm_functional_tests.c b/tools/testing/selftests/mm/ksm_functional_tests.c index b61803e36d1c..9fb79f6bf86d 100644 --- a/tools/testing/selftests/mm/ksm_functional_tests.c +++ b/tools/testing/selftests/mm/ksm_functional_tests.c @@ -73,74 +73,18 @@ static bool range_maps_duplicates(char *addr, unsigned long size) return false; } -static long get_my_ksm_zero_pages(void) -{ - char buf[200]; - char *substr_ksm_zero; - size_t value_pos; - ssize_t read_size; - unsigned long my_ksm_zero_pages; - - if (!proc_self_ksm_stat_fd) - return 0; - - read_size = pread(proc_self_ksm_stat_fd, buf, sizeof(buf) - 1, 0); - if (read_size < 0) - return -errno; - - buf[read_size] = 0; - - substr_ksm_zero = strstr(buf, "ksm_zero_pages"); - if (!substr_ksm_zero) - return 0; - - value_pos = strcspn(substr_ksm_zero, "0123456789"); - my_ksm_zero_pages = strtol(substr_ksm_zero + value_pos, NULL, 10); - - return my_ksm_zero_pages; -} - -static long get_my_merging_pages(void) -{ - char buf[10]; - ssize_t ret; - - if (proc_self_ksm_merging_pages_fd < 0) - return proc_self_ksm_merging_pages_fd; - - ret = pread(proc_self_ksm_merging_pages_fd, buf, sizeof(buf) - 1, 0); - if (ret <= 0) - return -errno; - buf[ret] = 0; - - return strtol(buf, NULL, 10); -} - -static long ksm_get_full_scans(void) -{ - char buf[10]; - ssize_t ret; - - ret = pread(ksm_full_scans_fd, buf, sizeof(buf) - 1, 0); - if (ret <= 0) - return -errno; - buf[ret] = 0; - - return strtol(buf, NULL, 10); -} - static int ksm_merge(void) { long start_scans, end_scans; /* Wait for two full scans such that any possible merging happened. */ - start_scans = ksm_get_full_scans(); + start_scans = ksm_get_full_scans(ksm_full_scans_fd); if (start_scans < 0) return start_scans; - if (write(ksm_fd, "1", 1) != 1) + if (ksm_start_and_merge(ksm_fd) != 1) return -errno; do { - end_scans = ksm_get_full_scans(); + end_scans = ksm_get_full_scans(ksm_full_scans_fd); if (end_scans < 0) return end_scans; } while (end_scans < start_scans + 2); @@ -150,7 +94,7 @@ static int ksm_merge(void) static int ksm_unmerge(void) { - if (write(ksm_fd, "2", 1) != 1) + if (ksm_stop_and_unmerge(ksm_fd) != 1) return -errno; return 0; } @@ -168,7 +112,7 @@ static char *__mmap_and_merge_range(char val, unsigned long size, int prot, return err_map; } - if (get_my_merging_pages() > 0) { + if (ksm_get_self_merging_pages(proc_self_ksm_merging_pages_fd) > 0) { ksft_print_msg("Still pages merged\n"); return err_map; } @@ -227,7 +171,7 @@ static char *__mmap_and_merge_range(char val, unsigned long size, int prot, * Check if anything was merged at all. Ignore the zero page that is * accounted differently (depending on kernel support). */ - if (val && !get_my_merging_pages()) { + if (val && !ksm_get_self_merging_pages(proc_self_ksm_merging_pages_fd)) { ksft_print_msg("No pages got merged\n"); goto unmap; } @@ -294,7 +238,7 @@ static void test_unmerge_zero_pages(void) ksft_test_result_skip("open \"/sys/kernel/mm/ksm/use_zero_pages\" failed\n"); return; } - if (write(ksm_use_zero_pages_fd, "1", 1) != 1) { + if (ksm_use_zero_pages(ksm_use_zero_pages_fd) != 1) { ksft_test_result_skip("write \"/sys/kernel/mm/ksm/use_zero_pages\" failed\n"); return; } @@ -306,7 +250,7 @@ static void test_unmerge_zero_pages(void) /* Check if ksm_zero_pages is updated correctly after KSM merging */ pages_expected = size / pagesize; - if (pages_expected != get_my_ksm_zero_pages()) { + if (pages_expected != ksm_get_self_zero_pages(proc_self_ksm_stat_fd)) { ksft_test_result_fail("'ksm_zero_pages' updated after merging\n"); goto unmap; } @@ -319,7 +263,7 @@ static void test_unmerge_zero_pages(void) /* Check if ksm_zero_pages is updated correctly after unmerging */ pages_expected /= 2; - if (pages_expected != get_my_ksm_zero_pages()) { + if (pages_expected != ksm_get_self_zero_pages(proc_self_ksm_stat_fd)) { ksft_test_result_fail("'ksm_zero_pages' updated after unmerging\n"); goto unmap; } @@ -329,7 +273,7 @@ static void test_unmerge_zero_pages(void) *((unsigned int *)&map[offs]) = offs; /* Now we should have no zeropages remaining. */ - if (get_my_ksm_zero_pages()) { + if (ksm_get_self_zero_pages(proc_self_ksm_stat_fd)) { ksft_test_result_fail("'ksm_zero_pages' updated after write fault\n"); goto unmap; } diff --git a/tools/testing/selftests/mm/vm_util.c b/tools/testing/selftests/mm/vm_util.c index 1357e2d6a7b6..115422e9eb68 100644 --- a/tools/testing/selftests/mm/vm_util.c +++ b/tools/testing/selftests/mm/vm_util.c @@ -486,3 +486,74 @@ int close_procmap(struct procmap_fd *procmap) { return close(procmap->fd); } + +int ksm_use_zero_pages(int ksm_use_zero_pages_fd) +{ + return write(ksm_use_zero_pages_fd, "1", 1); +} + +int ksm_start_and_merge(int ksm_fd) +{ + return write(ksm_fd, "1", 1); +} + +int ksm_stop_and_unmerge(int ksm_fd) +{ + return write(ksm_fd, "2", 1); +} + +long ksm_get_full_scans(int ksm_full_scans_fd) +{ + char buf[10]; + ssize_t ret; + + ret = pread(ksm_full_scans_fd, buf, sizeof(buf) - 1, 0); + if (ret <= 0) + return -errno; + buf[ret] = 0; + + return strtol(buf, NULL, 10); +} + +long ksm_get_self_merging_pages(int proc_self_ksm_merging_pages_fd) +{ + char buf[10]; + ssize_t ret; + + if (proc_self_ksm_merging_pages_fd < 0) + return proc_self_ksm_merging_pages_fd; + + ret = pread(proc_self_ksm_merging_pages_fd, buf, sizeof(buf) - 1, 0); + if (ret <= 0) + return -errno; + buf[ret] = 0; + + return strtol(buf, NULL, 10); +} + +long ksm_get_self_zero_pages(int proc_self_ksm_stat_fd) +{ + char buf[200]; + char *substr_ksm_zero; + size_t value_pos; + ssize_t read_size; + unsigned long my_ksm_zero_pages; + + if (!proc_self_ksm_stat_fd) + return 0; + + read_size = pread(proc_self_ksm_stat_fd, buf, sizeof(buf) - 1, 0); + if (read_size < 0) + return -errno; + + buf[read_size] = 0; + + substr_ksm_zero = strstr(buf, "ksm_zero_pages"); + if (!substr_ksm_zero) + return 0; + + value_pos = strcspn(substr_ksm_zero, "0123456789"); + my_ksm_zero_pages = strtol(substr_ksm_zero + value_pos, NULL, 10); + + return my_ksm_zero_pages; +} diff --git a/tools/testing/selftests/mm/vm_util.h b/tools/testing/selftests/mm/vm_util.h index 9211ba640d9c..99c1b1aa1813 100644 --- a/tools/testing/selftests/mm/vm_util.h +++ b/tools/testing/selftests/mm/vm_util.h @@ -95,6 +95,13 @@ static inline int open_self_procmap(struct procmap_fd *procmap_out) return open_procmap(pid, procmap_out); } +int ksm_use_zero_pages(int ksm_use_zero_pages_fd); +int ksm_start_and_merge(int ksm_fd); +int ksm_stop_and_unmerge(int ksm_fd); +long ksm_get_full_scans(int ksm_full_scans_fd); +long ksm_get_self_merging_pages(int proc_self_ksm_merging_pages_fd); +long ksm_get_self_zero_pages(int proc_self_ksm_stat_fd); + /* * On ppc64 this will only work with radix 2M hugepage size */ -- 2.34.1