Commit 9219565a authored by Nicholas Piggin's avatar Nicholas Piggin Committed by Ingo Molnar

sched/isolation: Require a present CPU in housekeeping mask

During housekeeping mask setup, currently a possible CPU is required.
That does not guarantee the CPU would be available at boot time, so
check to ensure that at least one present CPU is in the mask.
Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Rafael J . Wysocki <rafael.j.wysocki@intel.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: linuxppc-dev@lists.ozlabs.org
Link: https://lkml.kernel.org/r/20190411033448.20842-5-npiggin@gmail.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 9ca12ac0
...@@ -65,6 +65,7 @@ void __init housekeeping_init(void) ...@@ -65,6 +65,7 @@ void __init housekeeping_init(void)
static int __init housekeeping_setup(char *str, enum hk_flags flags) static int __init housekeeping_setup(char *str, enum hk_flags flags)
{ {
cpumask_var_t non_housekeeping_mask; cpumask_var_t non_housekeeping_mask;
cpumask_var_t tmp;
int err; int err;
alloc_bootmem_cpumask_var(&non_housekeeping_mask); alloc_bootmem_cpumask_var(&non_housekeeping_mask);
...@@ -75,16 +76,23 @@ static int __init housekeeping_setup(char *str, enum hk_flags flags) ...@@ -75,16 +76,23 @@ static int __init housekeeping_setup(char *str, enum hk_flags flags)
return 0; return 0;
} }
alloc_bootmem_cpumask_var(&tmp);
if (!housekeeping_flags) { if (!housekeeping_flags) {
alloc_bootmem_cpumask_var(&housekeeping_mask); alloc_bootmem_cpumask_var(&housekeeping_mask);
cpumask_andnot(housekeeping_mask, cpumask_andnot(housekeeping_mask,
cpu_possible_mask, non_housekeeping_mask); cpu_possible_mask, non_housekeeping_mask);
if (cpumask_empty(housekeeping_mask))
cpumask_andnot(tmp, cpu_present_mask, non_housekeeping_mask);
if (cpumask_empty(tmp)) {
pr_warn("Housekeeping: must include one present CPU, "
"using boot CPU:%d\n", smp_processor_id());
__cpumask_set_cpu(smp_processor_id(), housekeeping_mask); __cpumask_set_cpu(smp_processor_id(), housekeeping_mask);
__cpumask_clear_cpu(smp_processor_id(), non_housekeeping_mask);
}
} else { } else {
cpumask_var_t tmp; cpumask_andnot(tmp, cpu_present_mask, non_housekeeping_mask);
if (cpumask_empty(tmp))
alloc_bootmem_cpumask_var(&tmp); __cpumask_clear_cpu(smp_processor_id(), non_housekeeping_mask);
cpumask_andnot(tmp, cpu_possible_mask, non_housekeeping_mask); cpumask_andnot(tmp, cpu_possible_mask, non_housekeeping_mask);
if (!cpumask_equal(tmp, housekeeping_mask)) { if (!cpumask_equal(tmp, housekeeping_mask)) {
pr_warn("Housekeeping: nohz_full= must match isolcpus=\n"); pr_warn("Housekeeping: nohz_full= must match isolcpus=\n");
...@@ -92,8 +100,8 @@ static int __init housekeeping_setup(char *str, enum hk_flags flags) ...@@ -92,8 +100,8 @@ static int __init housekeeping_setup(char *str, enum hk_flags flags)
free_bootmem_cpumask_var(non_housekeeping_mask); free_bootmem_cpumask_var(non_housekeeping_mask);
return 0; return 0;
} }
free_bootmem_cpumask_var(tmp);
} }
free_bootmem_cpumask_var(tmp);
if ((flags & HK_FLAG_TICK) && !(housekeeping_flags & HK_FLAG_TICK)) { if ((flags & HK_FLAG_TICK) && !(housekeeping_flags & HK_FLAG_TICK)) {
if (IS_ENABLED(CONFIG_NO_HZ_FULL)) { if (IS_ENABLED(CONFIG_NO_HZ_FULL)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment