mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-31 10:31:33 -04:00
mm/page_reporting: add page_reporting_delay_ms module parameter
Free page reporting currently hardcodes a 2-second interval between reports. This rigid delay cannot accommodate diverse guest workloads. This patch introduces a module parameter, page_reporting_delay_ms (default: 2000), allowing users to tune the reporting rate: - Lower values enable aggressive memory reclamation by returning unused pages to the host immediately. - Higher values help batch pages during spiky allocation/free churn, reducing hypercalls and nested page fault overheads. Setting the delay to 0 is safe and execution is strictly gated by: - reporting is only triggered by high-order page frees. - expensive hypercalls are bounded by a slot capacity watermark check before proceeding. Link: https://lore.kernel.org/20260731193705.2902728-1-pratmal@google.com Signed-off-by: Pratyush Mallick <pratmal@google.com> Reviewed-by: SJ Park <sj@kernel.org> Acked-by: Lorenzo Stoakes (ARM) <ljs@kernel.org> Acked-by: David Hildenbrand (Arm) <david@kernel.org> Cc: Anshuman Khandual <anshuman.khandual@arm.com> Cc: Brendan Jackman <jackmanb@google.com> Cc: Greg Thelen <gthelen@google.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Jonathan Corbet <corbet@lwn.net> Cc: Liam R. Howlett <liam@infradead.org> Cc: Michal Hocko <mhocko@suse.com> Cc: Mike Rapoport <rppt@kernel.org> Cc: SeongJae Park <sj@kernel.org> Cc: Suren Baghdasaryan <surenb@google.com> Cc: Vlastimil Babka <vbabka@kernel.org> Cc: Zi Yan <ziy@nvidia.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
committed by
Andrew Morton
parent
5120b1e048
commit
7a39f03bc9
@@ -4810,6 +4810,12 @@ Kernel parameters
|
||||
Adjust the minimal page reporting order. The page
|
||||
reporting is disabled when it exceeds MAX_PAGE_ORDER.
|
||||
|
||||
page_reporting.page_reporting_delay_ms=
|
||||
[KNL] Free page reporting delay in milliseconds
|
||||
Format: <unsigned integer>
|
||||
Adjust the delay in milliseconds between free page
|
||||
reporting intervals. Default is 2000 (2 seconds).
|
||||
|
||||
panic= [KNL] Kernel behaviour on panic: delay <timeout>
|
||||
timeout > 0: seconds before rebooting
|
||||
timeout = 0: wait forever
|
||||
|
||||
@@ -48,7 +48,11 @@ MODULE_PARM_DESC(page_reporting_order, "Set page reporting order");
|
||||
*/
|
||||
EXPORT_SYMBOL_GPL(page_reporting_order);
|
||||
|
||||
#define PAGE_REPORTING_DELAY (2 * HZ)
|
||||
static unsigned int page_reporting_delay_ms = 2 * MSEC_PER_SEC;
|
||||
module_param(page_reporting_delay_ms, uint, 0644);
|
||||
MODULE_PARM_DESC(page_reporting_delay_ms,
|
||||
"Set page reporting delay in milliseconds");
|
||||
|
||||
static struct page_reporting_dev_info __rcu *pr_dev_info __read_mostly;
|
||||
|
||||
enum {
|
||||
@@ -57,6 +61,13 @@ enum {
|
||||
PAGE_REPORTING_ACTIVE
|
||||
};
|
||||
|
||||
/* schedule work for page reporting */
|
||||
static void page_reporting_schedule_work(struct page_reporting_dev_info *prdev)
|
||||
{
|
||||
queue_delayed_work(system_freezable_wq, &prdev->work,
|
||||
msecs_to_jiffies(page_reporting_delay_ms));
|
||||
}
|
||||
|
||||
/* request page reporting */
|
||||
static void
|
||||
__page_reporting_request(struct page_reporting_dev_info *prdev)
|
||||
@@ -77,12 +88,10 @@ __page_reporting_request(struct page_reporting_dev_info *prdev)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Delay the start of work to allow a sizable queue to build. For
|
||||
* now we are limiting this to running no more than once every
|
||||
* couple of seconds.
|
||||
* Delay the start of work to allow a sizable queue to build.
|
||||
* We limit this based on page_reporting_delay_ms.
|
||||
*/
|
||||
queue_delayed_work(system_freezable_wq, &prdev->work,
|
||||
PAGE_REPORTING_DELAY);
|
||||
page_reporting_schedule_work(prdev);
|
||||
}
|
||||
|
||||
/* notify prdev of free page reporting request */
|
||||
@@ -337,13 +346,12 @@ static void page_reporting_process(struct work_struct *work)
|
||||
err_out:
|
||||
/*
|
||||
* If the state has reverted back to requested then there may be
|
||||
* additional pages to be processed. We will defer for 2s to allow
|
||||
* more pages to accumulate.
|
||||
* additional pages to be processed. We will defer by
|
||||
* page_reporting_delay_ms to allow more pages to accumulate.
|
||||
*/
|
||||
state = atomic_cmpxchg(&prdev->state, state, PAGE_REPORTING_IDLE);
|
||||
if (state == PAGE_REPORTING_REQUESTED)
|
||||
queue_delayed_work(system_freezable_wq, &prdev->work,
|
||||
PAGE_REPORTING_DELAY);
|
||||
page_reporting_schedule_work(prdev);
|
||||
}
|
||||
|
||||
static DEFINE_MUTEX(page_reporting_mutex);
|
||||
|
||||
Reference in New Issue
Block a user