[LTP] [PATCH v3 29/31] testcases: sysfs: Add sys_ksm01
Cyril Hrubis
chrubis@suse.cz
Tue Aug 25 13:36:23 CEST 2026
A test for /sys/kernel/mm/ksm/* files.
Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
---
runtest/sysfs | 1 +
.../kernel/sysfs/kernel/mm/ksm/.gitignore | 1 +
testcases/kernel/sysfs/kernel/mm/ksm/Makefile | 7 ++
.../kernel/sysfs/kernel/mm/ksm/sys_ksm01.c | 64 +++++++++++++++++++
4 files changed, 73 insertions(+)
create mode 100644 testcases/kernel/sysfs/kernel/mm/ksm/.gitignore
create mode 100644 testcases/kernel/sysfs/kernel/mm/ksm/Makefile
create mode 100644 testcases/kernel/sysfs/kernel/mm/ksm/sys_ksm01.c
diff --git a/runtest/sysfs b/runtest/sysfs
index ec38d8b44..08358ebc6 100644
--- a/runtest/sysfs
+++ b/runtest/sysfs
@@ -24,3 +24,4 @@ sys_block_queue01 sys_block_queue01
sys_block_size01 sys_block_size01
sys_hugepages01 sys_hugepages01
sys_hugepages02 sys_hugepages02
+sys_ksm01 sys_ksm01
diff --git a/testcases/kernel/sysfs/kernel/mm/ksm/.gitignore b/testcases/kernel/sysfs/kernel/mm/ksm/.gitignore
new file mode 100644
index 000000000..92fa7e2c1
--- /dev/null
+++ b/testcases/kernel/sysfs/kernel/mm/ksm/.gitignore
@@ -0,0 +1 @@
+/sys_ksm01
diff --git a/testcases/kernel/sysfs/kernel/mm/ksm/Makefile b/testcases/kernel/sysfs/kernel/mm/ksm/Makefile
new file mode 100644
index 000000000..781865569
--- /dev/null
+++ b/testcases/kernel/sysfs/kernel/mm/ksm/Makefile
@@ -0,0 +1,7 @@
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright (c) 2026 Cyril Hrubis <chrubis@suse.cz>
+
+top_srcdir ?= ../../../../../..
+
+include $(top_srcdir)/include/mk/testcases.mk
+include $(top_srcdir)/include/mk/generic_leaf_target.mk
diff --git a/testcases/kernel/sysfs/kernel/mm/ksm/sys_ksm01.c b/testcases/kernel/sysfs/kernel/mm/ksm/sys_ksm01.c
new file mode 100644
index 000000000..b089e2bae
--- /dev/null
+++ b/testcases/kernel/sysfs/kernel/mm/ksm/sys_ksm01.c
@@ -0,0 +1,64 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2026 Cyril Hrubis <chrubis@suse.cz>
+ */
+
+/*\
+ * Sanity checks for the Kernel Samepage Merging (KSM) attributes exported
+ * under /sys/kernel/mm/ksm/.
+ *
+ * The test verifies that:
+ *
+ * - run is one of 0 (stop), 1 (run) or 2 (unmerge)
+ * - merge_across_nodes and use_zero_pages are booleans
+ * - max_page_sharing is greater than 2 and less than INT_MAX
+ * - pages_to_scan and sleep_millisecs are non-negative
+ * - the page accounting counters (pages_shared, pages_sharing, pages_unshared,
+ * pages_volatile, stable_node_chains, stable_node_dups) are non-negative
+ *
+ * All checks skip gracefully with TCONF when a particular attribute is not
+ * present, since the set of KSM tunables differs between kernel versions.
+ */
+
+#include <limits.h>
+#include "tst_test.h"
+#include "tst_sysfs_assert.h"
+
+#define KSM "/sys/kernel/mm/ksm"
+
+static const char *const nonneg_counters[] = {
+ "pages_shared",
+ "pages_sharing",
+ "pages_unshared",
+ "pages_volatile",
+ "stable_node_chains",
+ "stable_node_dups",
+ "pages_to_scan",
+ "sleep_millisecs",
+};
+
+static void do_test(void)
+{
+ unsigned int i;
+
+ /* 0 = stop, 1 = merge, 2 = unmerge */
+ TST_SYSFS_ASSERT_RANGELL(0, 2, KSM "/run");
+
+ TST_SYSFS_ASSERT_BOOL(KSM "/merge_across_nodes");
+ TST_SYSFS_ASSERT_BOOL(KSM "/use_zero_pages");
+
+ TST_SYSFS_ASSERT_RANGELL(2, INT_MAX, KSM "/max_page_sharing");
+
+ for (i = 0; i < ARRAY_SIZE(nonneg_counters); i++) {
+ TST_SYSFS_ASSERT_RANGEUU(0, ULONG_MAX, KSM "/%s",
+ nonneg_counters[i]);
+ }
+}
+
+static struct tst_test test = {
+ .test_all = do_test,
+ .needs_kconfigs = (const char *const[]){
+ "CONFIG_KSM=y",
+ NULL
+ },
+};
--
2.51.0
More information about the ltp
mailing list