From: Usama Arif <usama.arif@linux.dev>
To: David Rientjes <rientjes@google.com>
Cc: Usama Arif <usama.arif@linux.dev>,
Andrew Morton <akpm@linux-foundation.org>,
David Hildenbrand <david@kernel.org>,
Christoph Lameter <cl@gentwo.org>,
Vlastimil Babka <vbabka@kernel.org>,
Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
linux-mm@kvack.org, linux-kernel@vger.kernel.org
Subject: Re: [patch 1/3] lib: test_vmstat: add synthetic benchmark for vm stats
Date: Sat, 1 Aug 2026 06:20:37 -0700 [thread overview]
Message-ID: <20260801132038.2926647-1-usama.arif@linux.dev> (raw)
In-Reply-To: <e8dd28ab-ea7f-2ccf-c89e-a12f2d8b9988@google.com>
On Thu, 30 Jul 2026 21:26:23 -0700 (PDT) David Rientjes <rientjes@google.com> wrote:
> 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);
> +
Good to check page != NULL before using it below.
> + 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);
Why use inc_zone_page_state() but the __ variant for decrement?
Checking the 2 functions, __dec_zone_page_state() might cause
problems if preemption is enabled?
> +
> + 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-08-01 13:20 UTC|newest]
Thread overview: 6+ 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 ` [patch 1/3] lib: test_vmstat: add synthetic benchmark for vm stats David Rientjes
2026-08-01 13:20 ` Usama Arif [this message]
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)
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=20260801132038.2926647-1-usama.arif@linux.dev \
--to=usama.arif@linux.dev \
--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=rientjes@google.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