Re: [PATCH v4 1/5] nohz_full: add support for "cpu_isolated" mode
From: Christoph Lameter <hidden>
Date: 2015-07-22 20:02:35
Also in:
lkml
On Wed, 22 Jul 2015, Paul E. McKenney wrote:
quoted
quoted
Didn't Christoph Lameter fix this? Or is this an additional problem?Well the vmstat update must realize first that there are no outstanding updates before switching itself off. So typically there is one extra tick. But we could add another function that will simply fold the differential immediately and turn the kworker task in the expectation that the processor will stay quiet.Got it, thank you! Thanx, Paul
Ok here is a function that quiets down the vmstat kworkers. Subject: vmstat: provide a function to quiet down the diff processing 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 <redacted> Index: linux/mm/vmstat.c ===================================================================
--- linux.orig/mm/vmstat.c
+++ linux/mm/vmstat.c@@ -1394,6 +1394,20 @@ static void vmstat_update(struct work_st } /* + * 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. */
Index: linux/include/linux/vmstat.h ===================================================================
--- linux.orig/include/linux/vmstat.h
+++ linux/include/linux/vmstat.h@@ -211,6 +211,7 @@ extern void __inc_zone_state(struct zone 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);
@@ -272,6 +273,7 @@ static inline void __dec_zone_page_state static inline void refresh_cpu_vm_stats(int cpu) { } 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) { }