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 DA1C3C83F27 for ; Wed, 16 Jul 2025 08:27:56 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 9D0756B00A8; Wed, 16 Jul 2025 04:27:55 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 95ABD6B00A9; Wed, 16 Jul 2025 04:27:55 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 897C86B00AA; Wed, 16 Jul 2025 04:27:55 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 677566B00A8 for ; Wed, 16 Jul 2025 04:27:55 -0400 (EDT) Received: from smtpin09.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 2343F57356 for ; Wed, 16 Jul 2025 08:27:55 +0000 (UTC) X-FDA: 83669449710.09.5D8FC0A Received: from mail-ed1-f44.google.com (mail-ed1-f44.google.com [209.85.208.44]) by imf22.hostedemail.com (Postfix) with ESMTP id 48663C0002 for ; Wed, 16 Jul 2025 08:27:53 +0000 (UTC) Authentication-Results: imf22.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=WeawIVzx; spf=pass (imf22.hostedemail.com: domain of richard.weiyang@gmail.com designates 209.85.208.44 as permitted sender) smtp.mailfrom=richard.weiyang@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=1752654473; 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=gw013Rp3XpnfKo/oOMzmzzicQG5EiI7Jpa1QDO/KqtA=; b=ajKi/D8Yl8oyzAsrIj2hOD3gYcrcplUymz3EAhzZ5Zxj8jBwMy2JUq/1g2LzyFHnckYep+ MdjX95cZ+PHgzdvCbkCV7SSBAZGugduWJ4+ahQNdFxxvCl51D+6GO56i7Y5sLYZciyxlar dRAAhc0t9JSdxlsiv3rmMVY3ejRro9U= ARC-Authentication-Results: i=1; imf22.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=WeawIVzx; spf=pass (imf22.hostedemail.com: domain of richard.weiyang@gmail.com designates 209.85.208.44 as permitted sender) smtp.mailfrom=richard.weiyang@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1752654473; a=rsa-sha256; cv=none; b=Bjwy1t54AoMgTPCQFUdQOxpCdFdGiu1sEP+uvDU/qpgj6Iqa28jee0X7wXzfuBXDyzde+w lvdth8znm2lWbdiRsOxxMJ6fq7ZVUVPFx7PRo/o7XtZlPnq6NHi6fa38Z4e4h79uFmyeOW TINgYSNL4MnmEIO16xS+W9SaM0BjL3g= Received: by mail-ed1-f44.google.com with SMTP id 4fb4d7f45d1cf-6088d856c6eso11388705a12.0 for ; Wed, 16 Jul 2025 01:27:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1752654472; x=1753259272; 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=gw013Rp3XpnfKo/oOMzmzzicQG5EiI7Jpa1QDO/KqtA=; b=WeawIVzxMAJUSAk/uFKRf4zScgLo96XVxr3vHpkQAK/voPZcVh8YbCn2Tlv0J7fxeY t/GKoflQCVC5f5QKRPjS8BuPXLl3fBERN1vc1UGmHQlGxvMbPyZLMLBfGtcMuDB+6erG zlIJLALaj9CzCSdZFuiuB6O8NyiDj+hiR5KhiBV5zHyCdfujytNvQgeH+YacS7+Xq+gv Ipn7ux7x0DP54i1QXlwepmDDmT8FU4WkMBJXrP2D6PzwU+3Z+fUxKEUuGsW3LbVBkoXT l+Fzysyk72GSkjzhtupwE2CvhTSUOAK3kw/RheEhmU1ELPKLyBwmOVxTDvgE2oksHHHw N40g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1752654472; x=1753259272; 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=gw013Rp3XpnfKo/oOMzmzzicQG5EiI7Jpa1QDO/KqtA=; b=lUDqzq8OyKqszMk89xHow3NXVQs/7SiWrg+mpZFO74WcWgzisp7f8+qY5d1qlQdtl+ 0dMwh2q3jFaEepfsTGEU6xSLkgjq/QbmvVC9+LHWOPrbOzbt5R/2HPPiHS7md5Yx4Cax EWlpaGBC2UZgaHM+rytyF6dfaIa6bfBvsdR4qpJk56Sbgw4U+ntCJ/3QINHyqfyFb1qi FB/+Akme2XGZxW+sWyKYWVvgWIhHrcbzB5zuywYoeSl7LIybqF7FpuyyW0H+V9z1TYva LKjHXBF6lk3XHEjRZR4LjZykdkZUlAdy0UO03nS0RT8h6JNM3fQ1lnQRXBzqSdhy+il8 UoFQ== X-Gm-Message-State: AOJu0Yx2HzHcRUPkuHgMIftUhIIPrXRpv1BbBESHYNBKRW7CQNuQJPmx UvMs33a3vRspA9eWRWv6RahykUUJRCUD3TDVn0aWr4NrZDGyL8SBcjZu X-Gm-Gg: ASbGncugDtFNj+3znY72YY+SZ+AkOfkp7C4eGeik3o7Md6cZZPv6fzhF+ZDiTk3bVNg UnwHGo536YRvvWaBcSRzQkxGFCMnXqgHyz2ymVZLcNuoS532lpze4XMStluppJELU2AecvaS8l9 X0/op+/QUSAJaWvXPJhz+Ieq112Kqqk7+KNUJIHZm3rAihru+MR62xvn1GqjB/9k1cLRUW6zbKh vB7o02jAe1SQYiEUunplJTuLE3m4jfJsfKdm8ze6lzMGRYtrXhDfKyXYS0ngJ2lypFhL6mt6MoI D04f6qQvj/LIX2FaygSBW615Wy7JYgw1rvL3I85ZIyfifbQr8rhNlQkucGTHY/cJuvx2ZDsuuBp En2bZu31ejlbvUT0MBEaY4Q== X-Google-Smtp-Source: AGHT+IF+wZypEZHsNHOL1Va/jJGV0ey4pasFqxjwizEe+KpGYvFsqeUus+OgKWLJS1xsvpDIYb+VVQ== X-Received: by 2002:a05:6402:42c4:b0:610:4546:2809 with SMTP id 4fb4d7f45d1cf-6128260be80mr2017745a12.23.1752654471300; Wed, 16 Jul 2025 01:27:51 -0700 (PDT) Received: from localhost ([185.92.221.13]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-611c976ec04sm8268209a12.60.2025.07.16.01.27.50 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Wed, 16 Jul 2025 01:27:50 -0700 (PDT) From: Wei Yang To: akpm@linux-foundation.org Cc: linux-mm@kvack.org, Wei Yang , David Hildenbrand , Lorenzo Stoakes , Rik van Riel , "Liam R . Howlett" , Vlastimil Babka , Harry Yoo Subject: [PATCH 2/3] selftests/mm: put general ksm operation into vm_util Date: Wed, 16 Jul 2025 08:27:09 +0000 Message-Id: <20250716082710.2801-3-richard.weiyang@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20250716082710.2801-1-richard.weiyang@gmail.com> References: <20250716082710.2801-1-richard.weiyang@gmail.com> X-Stat-Signature: 9b8bbtri1uck7fxnaz9frhtjrnm1icoy X-Rspamd-Server: rspam01 X-Rspamd-Queue-Id: 48663C0002 X-Rspam-User: X-HE-Tag: 1752654473-826061 X-HE-Meta: U2FsdGVkX1/yvRB1zUuCSqpS24ddCFXnYCRrnNMpxQd5/ibNP++whN+fsNjrLTaM4SvmAdf53lAd/bfD1RL3u1VW/G5SVzQRinMGAHd11i5R8UY0GY9QpEC2Q1Ho2y7OGHobak/IuUXoMgvYYIdC9x3u1R3ba/i0Ef8yQYT+LIRutyHqHzbDcj+sjI2sWv/QuIInxeOyf0twYjIaUFLCzUcs+cJP2lz1ttAEiYfOBnKAU55Mmb+FZBSnvrWX1l7n4TrcC1Lm2I5YI8Q5/j9ZsOFYqiwJ/xn5nOfNRPFANpSTfmoBP58TkLPolVu0/XwJlg2hXYQbabK1ACTGD+4qL07zlKKxMnHyCSUmeRhjjiGVezEVtdzSIIE6kQxiphZOHZ7zTM+K9B0fMwnzM9EsamTEpdtbjXbVXde4KBy5ab1o+FccZveiNEIwlKjEfha/nRhjPLVHGqptbx6Al4FDJntNc9szHEXckjANnxY7goMYwvMG5ZtNJDZRXBAD9S3DNcmd37E1LN8rWcQ/qIbndmt+bSmz/f5teowIsISgghDIbc0Ij9rVPBymiWmPdIbrLOlxLfLjaN6ZpyT6dl+SnAHbaWO+H1QF3hZDqYZJjf/6hflIBjoyMPWSsTpXyVl1YANP8t2I5Kix0kKLkFsPmX1lMvszGslxTIToNtkRwftCL2R8T5CFx4ER9lSAznmrJbqYBRswbHhEP95hmVt1E/Kuw10CZ/ghVhHTeZYK+qcVhiVhjH0fTwmXz0l/3siJ/JNoeaZ+gYbHZAFzw4mJ6kphCBJkVI7BXXn0KaGxZc/ylFZOlRcXx/6gG7w1Cv12G0Qwy8mYmnZqw/uSuajDv7c2PZjHuHoXvFA+WlQZJ/Y3X6GlHxlN/rnDw9unDMJx21ucw2OGb6OwTpdA5ToxBKS/D9+DV95pER239DqT2kk27PkOCnDrnXHKLS0Ak4RH6Kuc9ydfLug/UjH4eQL dd+kGlC2 3qx4T2sl+97Jb4gXNz7f/GF5Y0/T322H71kbyTnHPwJpix73UKr9H6DTrHmpPwKqBKiIEA5HoS1ASS/RvJ4AKDevOz0zkdpLWrfnrCX6m0FKRYr7EdckunvW9vDHrnel/+LLt/HvdELnFoxIh4Vwry7tMGg1q7j0vgM2bXwbb4ei6DAqXXisPsCnugMO5v9UdRwSdj4JPn0LHtP6+0R3YMJYhrjflyiayPBUTIhs3TQ+V9mwifUnmHCTrW27Sg+FCd7m4rG8hwJfnt2FTy7DU/ocucaQMqEvVLtwHtWbMdQV4sUA3ZJveqjLL91OLVgqsMQDMoJA9ZWEIrrDJfu0AVSlDIjtZ9nPre7tsfUyB8tx09IcMWi5zwCcfT/Z9NF7grJ2pDpaQbV6DR/lvxN1tzx7Mst2vkMpG0TeuHCgeaYZkYClJdH3KSzvKRckdJzADJWE5Pq3R2lqgQaqbP5jFwwLjD9qy5BU6bCsKkFCbr1X/U0qIVKWZkMY/r67F0KFHH9mfwGIwNhsW5a5ZjqF4+NWB0eRMqJAxC9dLZ3AZxLPLo4bbZs+ls29U+kgbtqxsBQpjsZjG2z42Q6SwpdGAtSKwTUq0L2YYplw1ucVMuACNrgDRIIJQm5XYBcRzeLY9iz9x4KvCtvBVG0c9N7Nu/pY+R1/GALhncft8Z2jLWps5I7E= 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 --- v1: open/close fd in function itself instead of pass as parameter --- .../selftests/mm/ksm_functional_tests.c | 95 ++------------- tools/testing/selftests/mm/vm_util.c | 111 ++++++++++++++++++ tools/testing/selftests/mm/vm_util.h | 7 ++ 3 files changed, 126 insertions(+), 87 deletions(-) diff --git a/tools/testing/selftests/mm/ksm_functional_tests.c b/tools/testing/selftests/mm/ksm_functional_tests.c index 6da5c3340e10..0b151f3a29dc 100644 --- a/tools/testing/selftests/mm/ksm_functional_tests.c +++ b/tools/testing/selftests/mm/ksm_functional_tests.c @@ -38,11 +38,6 @@ enum ksm_merge_mode { }; static int mem_fd; -static int ksm_fd; -static int ksm_full_scans_fd; -static int proc_self_ksm_stat_fd; -static int proc_self_ksm_merging_pages_fd; -static int ksm_use_zero_pages_fd; static int pagemap_fd; static size_t pagesize; @@ -73,62 +68,6 @@ 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 < 0) - 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; @@ -137,7 +76,7 @@ static int ksm_merge(void) start_scans = ksm_get_full_scans(); if (start_scans < 0) return start_scans; - if (write(ksm_fd, "1", 1) != 1) + if (ksm_start_and_merge()) return -errno; do { end_scans = ksm_get_full_scans(); @@ -150,7 +89,7 @@ static int ksm_merge(void) static int ksm_unmerge(void) { - if (write(ksm_fd, "2", 1) != 1) + if (ksm_stop_and_unmerge()) return -errno; return 0; } @@ -168,7 +107,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() > 0) { ksft_print_msg("Still pages merged\n"); return err_map; } @@ -227,7 +166,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()) { ksft_print_msg("No pages got merged\n"); goto unmap; } @@ -286,15 +225,7 @@ static void test_unmerge_zero_pages(void) ksft_print_msg("[RUN] %s\n", __func__); - if (proc_self_ksm_stat_fd < 0) { - ksft_test_result_skip("open(\"/proc/self/ksm_stat\") failed\n"); - return; - } - if (ksm_use_zero_pages_fd < 0) { - 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()) { ksft_test_result_skip("write \"/sys/kernel/mm/ksm/use_zero_pages\" failed\n"); return; } @@ -306,7 +237,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()) { ksft_test_result_fail("'ksm_zero_pages' updated after merging\n"); goto unmap; } @@ -319,7 +250,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()) { ksft_test_result_fail("'ksm_zero_pages' updated after unmerging\n"); goto unmap; } @@ -329,7 +260,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()) { ksft_test_result_fail("'ksm_zero_pages' updated after write fault\n"); goto unmap; } @@ -685,19 +616,9 @@ static void init_global_file_handles(void) mem_fd = open("/proc/self/mem", O_RDWR); if (mem_fd < 0) ksft_exit_fail_msg("opening /proc/self/mem failed\n"); - ksm_fd = open("/sys/kernel/mm/ksm/run", O_RDWR); - if (ksm_fd < 0) - ksft_exit_skip("open(\"/sys/kernel/mm/ksm/run\") failed\n"); - ksm_full_scans_fd = open("/sys/kernel/mm/ksm/full_scans", O_RDONLY); - if (ksm_full_scans_fd < 0) - ksft_exit_skip("open(\"/sys/kernel/mm/ksm/full_scans\") failed\n"); pagemap_fd = open("/proc/self/pagemap", O_RDONLY); if (pagemap_fd < 0) ksft_exit_skip("open(\"/proc/self/pagemap\") failed\n"); - proc_self_ksm_stat_fd = open("/proc/self/ksm_stat", O_RDONLY); - proc_self_ksm_merging_pages_fd = open("/proc/self/ksm_merging_pages", - O_RDONLY); - ksm_use_zero_pages_fd = open("/sys/kernel/mm/ksm/use_zero_pages", O_RDWR); } int main(int argc, char **argv) diff --git a/tools/testing/selftests/mm/vm_util.c b/tools/testing/selftests/mm/vm_util.c index 9dafa7669ef9..14973d957c9a 100644 --- a/tools/testing/selftests/mm/vm_util.c +++ b/tools/testing/selftests/mm/vm_util.c @@ -555,3 +555,114 @@ bool detect_huge_zeropage(void) close(fd); return enabled; } + +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; + + proc_self_ksm_stat_fd = open("/proc/self/ksm_stat", O_RDONLY); + if (proc_self_ksm_stat_fd < 0) + return 0; + + read_size = pread(proc_self_ksm_stat_fd, buf, sizeof(buf) - 1, 0); + close(proc_self_ksm_stat_fd); + 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; +} + +long ksm_get_self_merging_pages() +{ + int proc_self_ksm_merging_pages_fd; + char buf[10]; + ssize_t ret; + + proc_self_ksm_merging_pages_fd = open("/proc/self/ksm_merging_pages", + O_RDONLY); + 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); + close(proc_self_ksm_merging_pages_fd); + if (ret <= 0) + return -errno; + buf[ret] = 0; + + return strtol(buf, NULL, 10); +} + +long ksm_get_full_scans() +{ + int ksm_full_scans_fd; + char buf[10]; + ssize_t ret; + + ksm_full_scans_fd = open("/sys/kernel/mm/ksm/full_scans", O_RDONLY); + if (ksm_full_scans_fd < 0) + return ksm_full_scans_fd; + + ret = pread(ksm_full_scans_fd, buf, sizeof(buf) - 1, 0); + close(ksm_full_scans_fd); + if (ret <= 0) + return -errno; + buf[ret] = 0; + + return strtol(buf, NULL, 10); +} + +int ksm_use_zero_pages() +{ + int ksm_use_zero_pages_fd; + ssize_t ret; + + ksm_use_zero_pages_fd = open("/sys/kernel/mm/ksm/use_zero_pages", O_RDWR); + if (ksm_use_zero_pages_fd < 0) + return -1; + + ret = write(ksm_use_zero_pages_fd, "1", 1); + close(ksm_use_zero_pages_fd); + return ret == 1 ? 0 : ret; +} + +int ksm_start_and_merge() +{ + int ksm_fd; + ssize_t ret; + + ksm_fd = open("/sys/kernel/mm/ksm/run", O_RDWR); + if (ksm_fd < 0) + return -1; + + ret = write(ksm_fd, "1", 1); + close(ksm_fd); + return ret == 1 ? 0 : ret; +} + +int ksm_stop_and_unmerge() +{ + int ksm_fd; + ssize_t ret; + + ksm_fd = open("/sys/kernel/mm/ksm/run", O_RDWR); + if (ksm_fd < 0) + return -1; + + ret = write(ksm_fd, "2", 1); + close(ksm_fd); + return ret == 1 ? 0 : ret; +} diff --git a/tools/testing/selftests/mm/vm_util.h b/tools/testing/selftests/mm/vm_util.h index 2b154c287591..752ae0482df6 100644 --- a/tools/testing/selftests/mm/vm_util.h +++ b/tools/testing/selftests/mm/vm_util.h @@ -122,6 +122,13 @@ static inline void log_test_result(int result) void *sys_mremap(void *old_address, unsigned long old_size, unsigned long new_size, int flags, void *new_address); +long ksm_get_self_zero_pages(); +long ksm_get_self_merging_pages(); +long ksm_get_full_scans(); +int ksm_use_zero_pages(); +int ksm_start_and_merge(); +int ksm_stop_and_unmerge(); + /* * On ppc64 this will only work with radix 2M hugepage size */ -- 2.34.1