Messages in this thread Patch in this message | | | From | Chris Metcalf <> | Subject | [PATCH v9 01/13] vmstat: provide a function to quiet down the diff processing | Date | Mon, 4 Jan 2016 14:34:39 -0500 |
| |
From: Christoph Lameter <cl@linux.com>
quiet_vmstat() can be called in anticipation of a OS "quiet" period where no tick processing should be triggered. quiet_vmstat() will fold all pending differentials into the global counters and disable the vmstat_worker processing.
Note that the shepherd thread will continue scanning the differentials from another processor and will reenable the vmstat workers if it detects any changes.
Signed-off-by: Christoph Lameter <cl@linux.com> Signed-off-by: Chris Metcalf <cmetcalf@ezchip.com> --- include/linux/vmstat.h | 2 ++ mm/vmstat.c | 14 ++++++++++++++ 2 files changed, 16 insertions(+)
diff --git a/include/linux/vmstat.h b/include/linux/vmstat.h index 5dbc8b0ee567..6f5a21993ff3 100644 --- a/include/linux/vmstat.h +++ b/include/linux/vmstat.h @@ -189,6 +189,7 @@ extern void __inc_zone_state(struct zone *, enum zone_stat_item); extern void dec_zone_state(struct zone *, enum zone_stat_item); extern void __dec_zone_state(struct zone *, enum zone_stat_item); +void quiet_vmstat(void); void cpu_vm_stats_fold(int cpu); void refresh_zone_stat_thresholds(void); @@ -249,6 +250,7 @@ static inline void __dec_zone_page_state(struct page *page, static inline void refresh_zone_stat_thresholds(void) { } static inline void cpu_vm_stats_fold(int cpu) { } +static inline void quiet_vmstat(void) { } static inline void drain_zonestat(struct zone *zone, struct per_cpu_pageset *pset) { } diff --git a/mm/vmstat.c b/mm/vmstat.c index 0d5712b0206c..0510d2ec31a6 100644 --- a/mm/vmstat.c +++ b/mm/vmstat.c @@ -1418,6 +1418,20 @@ static void vmstat_update(struct work_struct *w) } /* + * Switch off vmstat processing and then fold all the remaining differentials + * until the diffs stay at zero. The function is used by NOHZ and can only be + * invoked when tick processing is not active. + */ +void quiet_vmstat(void) +{ + do { + if (!cpumask_test_and_set_cpu(smp_processor_id(), cpu_stat_off)) + cancel_delayed_work(this_cpu_ptr(&vmstat_work)); + + } while (refresh_cpu_vm_stats()); +} + +/* * Check if the diffs for a certain cpu indicate that * an update is needed. */ -- 2.1.2
| |