Add a write-only module parameter 'flush' that triggers an immediate page reporting cycle. Writing any value flushes pending work and runs one cycle synchronously.
This is useful for testing and benchmarking the pre-zeroed page optimization, where the reporting delay (2 seconds) makes it hard to ensure pages are reported before measuring allocation performance. echo 1 > /sys/module/page_reporting/parameters/flush Signed-off-by: Michael S. Tsirkin <[email protected]> Assisted-by: Claude:claude-opus-4-6 --- mm/page_reporting.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/mm/page_reporting.c b/mm/page_reporting.c index cb24832bdf4e..e9a2186e4c48 100644 --- a/mm/page_reporting.c +++ b/mm/page_reporting.c @@ -351,6 +351,31 @@ static void page_reporting_process(struct work_struct *work) static DEFINE_MUTEX(page_reporting_mutex); DEFINE_STATIC_KEY_FALSE(page_reporting_enabled); +static int page_reporting_flush_set(const char *val, + const struct kernel_param *kp) +{ + struct page_reporting_dev_info *prdev; + + mutex_lock(&page_reporting_mutex); + prdev = rcu_dereference_protected(pr_dev_info, + lockdep_is_held(&page_reporting_mutex)); + if (prdev) { + flush_delayed_work(&prdev->work); + __page_reporting_request(prdev); + flush_delayed_work(&prdev->work); + } + mutex_unlock(&page_reporting_mutex); + return 0; +} + +static const struct kernel_param_ops flush_ops = { + .set = page_reporting_flush_set, + .get = param_get_uint, +}; +static unsigned int page_reporting_flush; +module_param_cb(flush, &flush_ops, &page_reporting_flush, 0200); +MODULE_PARM_DESC(flush, "Trigger immediate page reporting cycle"); + int page_reporting_register(struct page_reporting_dev_info *prdev) { int err = 0; -- MST

