When the list of HK_FLAG_KERNEL_NOISE housekeeping CPUs are changed, we will need to update tick_nohz_full_mask so that dynticks can work correctly. Introduce a new tick_nohz_full_update_cpus() function that can be called at run time to update tick_nohz_full_mask.
Signed-off-by: Waiman Long longman@redhat.com --- include/linux/tick.h | 2 ++ kernel/time/tick-sched.c | 6 ++++++ 2 files changed, 8 insertions(+)
diff --git a/include/linux/tick.h b/include/linux/tick.h index ac76ae9fa36d..34907c0b632c 100644 --- a/include/linux/tick.h +++ b/include/linux/tick.h @@ -272,6 +272,7 @@ static inline void tick_dep_clear_signal(struct signal_struct *signal, extern void tick_nohz_full_kick_cpu(int cpu); extern void __tick_nohz_task_switch(void); extern void __init tick_nohz_full_setup(cpumask_var_t cpumask); +extern void tick_nohz_full_update_cpus(cpumask_var_t cpumask); #else static inline bool tick_nohz_full_enabled(void) { return false; } static inline bool tick_nohz_full_cpu(int cpu) { return false; } @@ -297,6 +298,7 @@ static inline void tick_dep_clear_signal(struct signal_struct *signal, static inline void tick_nohz_full_kick_cpu(int cpu) { } static inline void __tick_nohz_task_switch(void) { } static inline void tick_nohz_full_setup(cpumask_var_t cpumask) { } +static inline void tick_nohz_full_update_cpus(cpumask_var_t cpumask) { return false; } #endif
static inline void tick_nohz_task_switch(void) diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index 87b26a4471e7..9204808b7a55 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c @@ -604,6 +604,12 @@ void __init tick_nohz_full_setup(cpumask_var_t cpumask) tick_nohz_full_running = true; }
+/* Get the new set of run-time nohz CPU list from cpuset */ +void tick_nohz_full_update_cpus(cpumask_var_t cpumask) +{ + cpumask_copy(tick_nohz_full_mask, cpumask); +} + bool tick_nohz_cpu_hotpluggable(unsigned int cpu) { /*