From: David Rientjes <rientjes@google.com>
To: Andrew Morton <akpm@linux-foundation.org>,
David Hildenbrand <david@kernel.org>,
Christoph Lameter <cl@gentwo.org>
Cc: Vlastimil Babka <vbabka@kernel.org>,
Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
linux-mm@kvack.org, linux-kernel@vger.kernel.org
Subject: [patch 1/3] lib: test_vmstat: add synthetic benchmark for vm stats
Date: Thu, 30 Jul 2026 21:26:23 -0700 (PDT) [thread overview]
Message-ID: <e8dd28ab-ea7f-2ccf-c89e-a12f2d8b9988@google.com> (raw)
In-Reply-To: <d6787a7f-3213-2b2c-2de5-af3b02daa21f@google.com>
From: Christoph Lameter <cl@gentwo.org>
Add a synthetic benchmark that can be used to measure performance of VM
statistics. This is used to analyze any improvements or regressions in
functions that are frequently used in hot code paths.
The test is run by inserting the module: modprobe test_vmstat
The module insertion will always fail so that it is automatically
unloaded; the results are in the kernel log.
Signed-off-by: Christoph Lameter <cl@gentwo.org>
Signed-off-by: David Rientjes <rientjes@google.com>
---
lib/Kconfig.debug | 10 +++++
lib/Makefile | 1 +
lib/test_vmstat.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 106 insertions(+)
create mode 100644 lib/test_vmstat.c
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index 1244dcac2294..6d743c8e27fa 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -3427,6 +3427,16 @@ config TEST_KEXEC_HANDOVER
If unsure, say N.
+config TEST_VMSTAT
+ tristate "VM Statistics Benchmark"
+ default n
+ help
+ A synthetic benchmark measuring the performance of VM statistics,
+ useful to analyze any improvements or regressions in functions that
+ are frequently used in hot code paths.
+
+ If unsure, say N.
+
config RATELIMIT_KUNIT_TEST
tristate "KUnit Test for correctness and stress of ratelimit" if !KUNIT_ALL_TESTS
depends on KUNIT
diff --git a/lib/Makefile b/lib/Makefile
index 7f75cc6edf94..5f3ebabd0224 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -105,6 +105,7 @@ obj-$(CONFIG_TEST_FREE_PAGES) += test_free_pages.o
obj-$(CONFIG_TEST_REF_TRACKER) += test_ref_tracker.o
obj-$(CONFIG_TEST_OBJPOOL) += test_objpool.o
obj-$(CONFIG_TEST_KEXEC_HANDOVER) += test_kho.o
+obj-$(CONFIG_TEST_VMSTAT) += test_vmstat.o
obj-$(CONFIG_TEST_FPU) += test_fpu.o
test_fpu-y := test_fpu_glue.o test_fpu_impl.o
diff --git a/lib/test_vmstat.c b/lib/test_vmstat.c
new file mode 100644
index 000000000000..f63f439ab9d2
--- /dev/null
+++ b/lib/test_vmstat.c
@@ -0,0 +1,95 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Test module for in-kernel synthetic vm statistics performance.
+ *
+ * execute
+ *
+ * modprobe test_vmstat
+ *
+ * to run this test
+ *
+ * (C) 2009 Linux Foundation, Christoph Lameter <cl@gentwo.org>
+ */
+
+#include <linux/jiffies.h>
+#include <linux/compiler.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/mm.h>
+#include <asm/timex.h>
+
+#define TEST_COUNT 10000
+
+static int vmstat_test_init(void)
+{
+ unsigned int i;
+ cycles_t time1, time2, time;
+ int rem;
+ struct page *page = alloc_page(GFP_KERNEL);
+
+ pr_alert("VMstat testing\n");
+ pr_alert("=====================\n");
+ pr_alert("1. inc_zone_page_state() then dec_zone_page_state()\n");
+ time1 = get_cycles();
+ for (i = 0; i < TEST_COUNT; i++)
+ inc_zone_page_state(page, NR_FREE_CMA_PAGES);
+
+ time2 = get_cycles();
+ time = time2 - time1;
+
+ pr_alert("%i times inc_zone_page_state() ", i);
+ time = div_u64_rem(time, TEST_COUNT, &rem);
+ pr_cont("-> %llu cycles ", (unsigned long long) time);
+
+ time1 = get_cycles();
+ for (i = 0; i < TEST_COUNT; i++)
+ __dec_zone_page_state(page, NR_FREE_CMA_PAGES);
+
+ time2 = get_cycles();
+ time = time2 - time1;
+
+ pr_cont("__dec_z_p_s() ");
+ time = div_u64_rem(time, TEST_COUNT, &rem);
+ pr_cont("-> %llu cycles\n", (unsigned long long) time);
+
+ pr_alert("2. inc_zone_page_state()/dec_zone_page_state()\n");
+ time1 = get_cycles();
+ for (i = 0; i < TEST_COUNT; i++) {
+ inc_zone_page_state(page, NR_FREE_CMA_PAGES);
+ dec_zone_page_state(page, NR_FREE_CMA_PAGES);
+ }
+
+ time2 = get_cycles();
+ time = time2 - time1;
+
+ pr_alert("%i times inc/dec ", i);
+ time = div_u64_rem(time, TEST_COUNT, &rem);
+ pr_cont("-> %llu cycles\n", (unsigned long long) time);
+
+ pr_alert("3. count_vm_event()\n");
+ time1 = get_cycles();
+ for (i = 0; i < TEST_COUNT; i++)
+ count_vm_event(SLABS_SCANNED);
+
+ time2 = get_cycles();
+ time = time2 - time1;
+
+ count_vm_events(SLABS_SCANNED, -TEST_COUNT);
+ pr_alert("%i count_vm_events ", i);
+ time = div_u64_rem(time, TEST_COUNT, &rem);
+ pr_cont("-> %llu cycles\n", (unsigned long long) time);
+ __free_page(page);
+ return -EAGAIN; /* Fail will directly unload the module */
+}
+
+static void vmstat_test_exit(void)
+{
+ pr_alert("test exit\n");
+}
+
+module_init(vmstat_test_init)
+module_exit(vmstat_test_exit)
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Christoph Lameter");
+MODULE_DESCRIPTION("VM statistics test");
next prev parent reply other threads:[~2026-07-31 4:26 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-31 4:26 [patch 0/3] lib: add synthetic MM benchmarks David Rientjes
2026-07-31 4:26 ` David Rientjes [this message]
2026-08-01 13:20 ` [patch 1/3] lib: test_vmstat: add synthetic benchmark for vm stats Usama Arif
2026-08-02 23:05 ` David Rientjes
2026-08-02 23:06 ` [patch v2] " David Rientjes
2026-08-07 15:33 ` David Rientjes
2026-07-31 4:26 ` [patch 2/3] lib: test_slab: add synthetic benchmark for slab David Rientjes
2026-07-31 4:27 ` [patch 3/3] lib: test_pagealloc: add synthetic benchmark for page allocator David Rientjes
2026-07-31 9:00 ` [patch 0/3] lib: add synthetic MM benchmarks David Hildenbrand (Arm)
2026-08-02 22:19 ` David Rientjes
2026-08-05 7:03 ` David Hildenbrand (Arm)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=e8dd28ab-ea7f-2ccf-c89e-a12f2d8b9988@google.com \
--to=rientjes@google.com \
--cc=akpm@linux-foundation.org \
--cc=cl@gentwo.org \
--cc=david@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=vbabka@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox