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 6422FC282C1 for ; Fri, 28 Feb 2025 02:31:07 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 104F16B0083; Thu, 27 Feb 2025 21:31:03 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id F23756B008C; Thu, 27 Feb 2025 21:31:02 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id D31F46B0093; Thu, 27 Feb 2025 21:31:02 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 872006B0088 for ; Thu, 27 Feb 2025 21:31:02 -0500 (EST) Received: from smtpin28.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id 250FE82136 for ; Fri, 28 Feb 2025 02:31:02 +0000 (UTC) X-FDA: 83167775964.28.3FAB3B9 Received: from smtpout.efficios.com (smtpout.efficios.com [158.69.130.18]) by imf15.hostedemail.com (Postfix) with ESMTP id 9AE38A0007 for ; Fri, 28 Feb 2025 02:31:00 +0000 (UTC) Authentication-Results: imf15.hostedemail.com; dkim=pass header.d=efficios.com header.s=smtpout1 header.b=EmykgpXy; spf=pass (imf15.hostedemail.com: domain of mathieu.desnoyers@efficios.com designates 158.69.130.18 as permitted sender) smtp.mailfrom=mathieu.desnoyers@efficios.com; dmarc=pass (policy=none) header.from=efficios.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1740709860; 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=NQe5+uFBHMs29DYpVcjU1aCjnWzs001jFTZ02V7HwFw=; b=Rjk6pktkUvGSDYFHK/Me9CDQNueG7tNheB0ZWUmzsK3vquB6JbKjbm7g2OLO4R+VY6UU3G yZ6ZWKd0HR5f7YQBTManaT9lBKtjCjv1g1Y8Jl7p5DO/N1InvDKslzG7tXilHd3Rkt2OTt It+hjR7YxTlGa0bAIP3Uj35qh1xgEuU= ARC-Authentication-Results: i=1; imf15.hostedemail.com; dkim=pass header.d=efficios.com header.s=smtpout1 header.b=EmykgpXy; spf=pass (imf15.hostedemail.com: domain of mathieu.desnoyers@efficios.com designates 158.69.130.18 as permitted sender) smtp.mailfrom=mathieu.desnoyers@efficios.com; dmarc=pass (policy=none) header.from=efficios.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1740709860; a=rsa-sha256; cv=none; b=pyRUuZb7MoKUIBunXN5SzyRiWmYLEwB6Ol317coNn/+1r2WQVwcWLYlR3expF3N6Td+12s N0sNNrIPxtb7sjSaCCXiLSb3ZQMPka83fP381ONjlf2Wes9nLstK6ZW6GCqmoF99db5eO6 RKLsjyMFFhC29+M/DyuxOjLx3a+/2X4= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=efficios.com; s=smtpout1; t=1740709859; bh=swtR6F88cbKVzdm+NrDTVhCXo1eYZDF79C/l4caSVJw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=EmykgpXy1gGmyGYdH0Q9n3pB/kU2w6Z3jdYPyOvETkpaoGinxXvL1ftzDJpxQJPvK j0oZXtAv7ioeBglEIpSY51zV/Ugg3IG1XhBIUIbChKCG24IjOUo5gB8Pe3b5qEsJM6 mSQmWfl8KVSZVxipAgi5zAaB1lzi3Kw9Sz0KTrC2f+p7aUSV8jSooEL7dJFXMpWp/v tD+68xfXySOK4qj8Lt5VYmXRiIbHB4vHa2FV12bda8FqrgYT/k/moNPDvIC2OM892K Yh/xEw1QfT5GF8M63m55tigugUQxVpqSx8GtIbXPkSJA35wcSCuUmd7eFgt+6W1XOa K55eaNV4x+onA== Received: from thinkos.internal.efficios.com (unknown [IPv6:2606:6d00:100:4000:cacb:9855:de1f:ded2]) by smtpout.efficios.com (Postfix) with ESMTPSA id 4Z3sdb69Mgzylf; Thu, 27 Feb 2025 21:30:59 -0500 (EST) From: Mathieu Desnoyers To: Andrew Morton Cc: linux-kernel@vger.kernel.org, Mathieu Desnoyers , Linus Torvalds , Matthew Wilcox , Olivier Dion , linux-mm@kvack.org Subject: [RFC PATCH 2/2] selftests/kskm: Introduce SKSM basic test Date: Thu, 27 Feb 2025 21:30:43 -0500 Message-Id: <20250228023043.83726-3-mathieu.desnoyers@efficios.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250228023043.83726-1-mathieu.desnoyers@efficios.com> References: <20250228023043.83726-1-mathieu.desnoyers@efficios.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspam-User: X-Stat-Signature: sqeiwgkcgfhqihbkubhg9g13fy8g3eax X-Rspamd-Queue-Id: 9AE38A0007 X-Rspamd-Server: rspam07 X-HE-Tag: 1740709860-247593 X-HE-Meta: U2FsdGVkX1+ElsWLzw5e2OG7ga0CFS0mp2A5HkXLwHLRWGPMu+eao1ZvASxmH6SR+8bX09GgRfFGaOTNp5G3Icjq1OhIfkGWrYnO7NPZLNX+Plo9m1skdT26UhnVsygQFohXibU0oDv+8BBGJQ5FvEKsZYcyBCwEM9bbJ8M8oGl08BRoVfyt8u2D/UTWxyruMeRP1r24q/49Aau2u3FDw58GMTAzhRhjb7f+tcSetXVsK0JOb+O0X3Odq+h0P3bBOu6JFDl6gICNSeQTTcqEAatcOjbvlkwnh2N3IPkp8EGqNgtZNH6f5SEiT8gjG+mGo1gLs8Jpz39EhAStwHtSiF9iISeMDtSvvVhqXmoOtoocgtjrQBviAuktD+e7dCw7e+HOopbyDnoI5BWDXJ/2ZZVL5Wbj398nlvEs+qi7xpDtjzNKsoOl2IVkg1K7wlFvhvSGAEIr9wHRBVzql7Aaf7zbpKT5My+EJFPoWyZHx2y9MFvPNzQApwEpbOxcVi4m2B6L1fhI7ufIFNvkwf3BefFQ5N5/aJF+dF1XP7EL4O6iKZw7RQQBAJ9XoFep+JnbmPpnaUeHJjnkh40rJdlHudP2pBEZSFLAIpX07M/GmGT/n8HgGi/+ReJkjcYfgYOArSePfzqaC0g+GxRYukBoE5gn8BhaGS22uIRVByGbdLRkaktrcgDRWqNuteDnMBiQWppiwPGSUeCC1+Cu/liLew65LMUy07aO2DAooppNYqtyJ4W6OLbrCD+e84CqyVNQvOoPvj8Ac6+teLiOMQAA4+zxSy/PlIKWK+3sesRwHncagZVYvC8z2j5iQi1uoUamyqqOfyK6nBtN1oHECcVV7I8f0jxLDQ1ny3PE5TbS9oP258/2SIskHXk4+ZnJWGCVRROS/4XFQ5Az0xtdaF/IAs9YYd6YXNl2WjKv8UtpsDE8Vb8sRW4hEyRKRdOPhsuPyso73Ng5YUdw/+ScK95 z2G40Pxx dPCBEWBQeY1Z7OjmDjLAZGg72frR8A+ayvKF5jSC0zMZV2YEBZMSOp6IH2N8Iti4rrzpZ0Z0ynr4wPAcTewi5d2d2QGqX4EAJQhvHDipEAZRikc03Rh/UtG5BlRpP6YvlQC2tg3uxrZLN6g8FVJP+bAki28XHLshu5J7MHiLSBzzyZM8t8lEOYPGt97PBGyMJlMwDaMkiL1VPxHS9HdFvR2mHn/fc4YJ2PPw9MgeTkQZYZDUZicR/ypRozvMEZSbuvSMnEDSRZotOa3RSf+GCgQV3ojDK03v+w9Tz3sAU5nXmcqbEKp9qH27GsWa7iFkr1jFe86wrBMoW1UaMWtLwtqzQTQ8z+xWJvzklwLfX4BrT62q2I3rFdA4BTRtxrieSfTZCQVvqG1OM6BAwOHH0x78c4yR3qwJJaEx14zvxar0E/Fh8GpT7wVnck8/tpssZ22vQMyZjsiC3AUCZkm+ZoeP787xNjdy+QsBLyk4u6SADPJRsPknlRIR5FSEfn8cCykKH 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: Introduce a basic selftest for SKSM. See ./basic_test -h for options. Signed-off-by: Mathieu Desnoyers Cc: Andrew Morton Cc: Linus Torvalds Cc: Matthew Wilcox Cc: Olivier Dion Cc: linux-mm@kvack.org --- tools/testing/selftests/sksm/.gitignore | 2 + tools/testing/selftests/sksm/Makefile | 14 ++ tools/testing/selftests/sksm/basic_test.c | 217 ++++++++++++++++++++++ 3 files changed, 233 insertions(+) create mode 100644 tools/testing/selftests/sksm/.gitignore create mode 100644 tools/testing/selftests/sksm/Makefile create mode 100644 tools/testing/selftests/sksm/basic_test.c diff --git a/tools/testing/selftests/sksm/.gitignore b/tools/testing/selftests/sksm/.gitignore new file mode 100644 index 000000000000..0f5b0baa91e7 --- /dev/null +++ b/tools/testing/selftests/sksm/.gitignore @@ -0,0 +1,2 @@ +# SPDX-License-Identifier: GPL-2.0-only +basic_test diff --git a/tools/testing/selftests/sksm/Makefile b/tools/testing/selftests/sksm/Makefile new file mode 100644 index 000000000000..ec1a10783bda --- /dev/null +++ b/tools/testing/selftests/sksm/Makefile @@ -0,0 +1,14 @@ +# SPDX-License-Identifier: GPL-2.0+ OR MIT + +top_srcdir = ../../../.. + +CFLAGS += -O2 -Wall -g -I./ $(KHDR_INCLUDES) -L$(OUTPUT) -Wl,-rpath=./ \ + $(CLANG_FLAGS) -I$(top_srcdir)/tools/include +LDLIBS += -lpthread + +TEST_GEN_PROGS = basic_test + +include ../lib.mk + +$(OUTPUT)/%: %.c + $(CC) $(CFLAGS) $< $(LDLIBS) -o $@ diff --git a/tools/testing/selftests/sksm/basic_test.c b/tools/testing/selftests/sksm/basic_test.c new file mode 100644 index 000000000000..1a7571a999d2 --- /dev/null +++ b/tools/testing/selftests/sksm/basic_test.c @@ -0,0 +1,217 @@ +// SPDX-License-Identifier: LGPL-2.1 +/* + * Basic test for SKSM. + */ + +#include +#include +#include +#include +#include +#include +#include + +#ifndef MADV_MERGE +#define MADV_MERGE 26 +#endif + +#define PAGE_SIZE 4096 + +#define WRITE_ONCE(x, val) ((*(volatile typeof(x) *) &(x)) = (val)) + +static int opt_stop_at = 0, opt_pause = 0; + +struct test_page { + char array[PAGE_SIZE] __attribute__((aligned(PAGE_SIZE))); +}; + +struct test_page2 { + char array[2 * PAGE_SIZE] __attribute__((aligned(PAGE_SIZE))); +}; + +/* identical to zero page. */ +static struct test_page zero; + +/* a1 and a2 are identical. */ +static struct test_page a1 = { + .array[0] = 0x42, + .array[1] = 0x42, +}; + +static struct test_page a2 = { + .array[0] = 0x42, + .array[1] = 0x42, +}; + +/* b1 and b2 are identical. */ +static struct test_page2 b1 = { + .array[0] = 0x43, + .array[1] = 0x43, + .array[PAGE_SIZE] = 0x44, + .array[PAGE_SIZE + 1] = 0x44, +}; + +static struct test_page2 b2 = { + .array[0] = 0x43, + .array[1] = 0x43, + .array[PAGE_SIZE] = 0x44, + .array[PAGE_SIZE + 1] = 0x44, +}; + +static void touch_pages(void *p, size_t len) +{ + size_t i; + + for (i = 0; i < len; i += PAGE_SIZE) + WRITE_ONCE(((char *)p)[i], ((char *)p)[i]); +} + +static void test_step(char step) +{ + printf("\nTest step: <%c>\n", step); + if (opt_pause) { + printf("Press ENTER to continue...\n"); + getchar(); + } + if (opt_stop_at == step) { + poll(NULL, 0, -1); + exit(0); + } +} + +static void show_usage(int argc, char **argv) +{ + printf("Usage : %s \n", + argv[0]); + printf("OPTIONS:\n"); + printf(" [-s stop_at] Stop test at step A, B, C, D, E, or F and wait forever.\n"); + printf(" [-p] Pause test between steps (await newline from the console).\n"); + printf(" [-h] Show this help.\n"); + printf("\n"); +} + +int main(int argc, char **argv) +{ + int i; + + for (i = 1; i < argc; i++) { + if (argv[i][0] != '-') + continue; + switch (argv[i][1]) { + case 's': + if (argc < i + 2) { + show_usage(argc, argv); + return -1; + } + opt_stop_at = *argv[i + 1]; + switch (opt_stop_at) { + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + break; + default: + show_usage(argc, argv); + return -1; + } + i++; + break; + case 'p': + opt_pause = 1; + i++; + break; + case 'h': + show_usage(argc, argv); + return 0; + default: + show_usage(argc, argv); + return -1; + } + } + + + printf("PID: %d\n", getpid()); + printf("Shared mapping (write-protected)\n"); + + test_step('A'); + + printf("madvise MADV_MERGE a1\n"); + if (madvise(&a1, sizeof(a1), MADV_MERGE)) + goto error; + printf("madvise MADV_MERGE a2\n"); + if (madvise(&a2, sizeof(a2), MADV_MERGE)) + goto error; + printf("madvise MADV_MERGE b1\n"); + if (madvise(&b1, sizeof(b1), MADV_MERGE)) + goto error; + printf("madvise MADV_MERGE b2\n"); + if (madvise(&b2, sizeof(b2), MADV_MERGE)) + goto error; + printf("madvise MADV_MERGE zero\n"); + if (madvise(&zero, sizeof(zero), MADV_MERGE)) + goto error; + + test_step('B'); + + printf("Trigger COW\n"); + touch_pages(&zero, sizeof(zero)); + touch_pages(&a1, sizeof(a1)); + touch_pages(&a2, sizeof(a2)); + touch_pages(&b1, sizeof(b1)); + touch_pages(&b2, sizeof(b2)); + + test_step('C'); + + printf("madvise MADV_MERGE a1\n"); + if (madvise(&a1, sizeof(a1), MADV_MERGE)) + goto error; + printf("madvise MADV_MERGE a2\n"); + if (madvise(&a2, sizeof(a2), MADV_MERGE)) + goto error; + printf("madvise MADV_MERGE b1\n"); + if (madvise(&b1, sizeof(b1), MADV_MERGE)) + goto error; + printf("madvise MADV_MERGE b2\n"); + if (madvise(&b2, sizeof(b2), MADV_MERGE)) + goto error; + printf("madvise MADV_MERGE zero\n"); + if (madvise(&zero, sizeof(zero), MADV_MERGE)) + goto error; + + test_step('D'); + + printf("Trigger COW\n"); + touch_pages(&zero, sizeof(zero)); + touch_pages(&a1, sizeof(a1)); + touch_pages(&a2, sizeof(a2)); + touch_pages(&b1, sizeof(b1)); + touch_pages(&b2, sizeof(b2)); + + test_step('E'); + + printf("madvise MADV_MERGE a1\n"); + if (madvise(&a1, sizeof(a1), MADV_MERGE)) + goto error; + printf("madvise MADV_MERGE a2\n"); + if (madvise(&a2, sizeof(a2), MADV_MERGE)) + goto error; + printf("madvise MADV_MERGE b1\n"); + if (madvise(&b1, sizeof(b1), MADV_MERGE)) + goto error; + printf("madvise MADV_MERGE b2\n"); + if (madvise(&b2, sizeof(b2), MADV_MERGE)) + goto error; + printf("madvise MADV_MERGE zero\n"); + if (madvise(&zero, sizeof(zero), MADV_MERGE)) + goto error; + + test_step('F'); + + return 0; + +error: + perror("madvise"); + return -1; +} -- 2.39.5