Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

sched/isolation: Consolidate check for housekeeping minimum service

There can be two subsequent calls to housekeeping_setup() due to
"nohz_full=" and "isolcpus=" that can mix up. The two passes each have
their own way to deal with an empty housekeeping set of CPUs.
Consolidate this part and remove the awful "tmp" based naming.

Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Juri Lelli <juri.lelli@redhat.com>
Reviewed-by: Phil Auld <pauld@redhat.com>
Link: https://lore.kernel.org/r/20220207155910.527133-6-frederic@kernel.org

authored by

Frederic Weisbecker and committed by
Peter Zijlstra
6367b600 04d4e665

+17 -18
+17 -18
kernel/sched/isolation.c
··· 91 91 92 92 static int __init housekeeping_setup(char *str, enum hk_flags flags) 93 93 { 94 - cpumask_var_t non_housekeeping_mask; 95 - cpumask_var_t tmp; 94 + cpumask_var_t non_housekeeping_mask, housekeeping_staging; 96 95 97 96 alloc_bootmem_cpumask_var(&non_housekeeping_mask); 98 97 if (cpulist_parse(str, non_housekeeping_mask) < 0) { ··· 100 101 return 0; 101 102 } 102 103 103 - alloc_bootmem_cpumask_var(&tmp); 104 - if (!housekeeping_flags) { 105 - alloc_bootmem_cpumask_var(&housekeeping_mask); 106 - cpumask_andnot(housekeeping_mask, 107 - cpu_possible_mask, non_housekeeping_mask); 104 + alloc_bootmem_cpumask_var(&housekeeping_staging); 105 + cpumask_andnot(housekeeping_staging, 106 + cpu_possible_mask, non_housekeeping_mask); 108 107 109 - cpumask_andnot(tmp, cpu_present_mask, non_housekeeping_mask); 110 - if (cpumask_empty(tmp)) { 108 + if (!cpumask_intersects(cpu_present_mask, housekeeping_staging)) { 109 + __cpumask_set_cpu(smp_processor_id(), housekeeping_staging); 110 + __cpumask_clear_cpu(smp_processor_id(), non_housekeeping_mask); 111 + if (!housekeeping_flags) { 111 112 pr_warn("Housekeeping: must include one present CPU, " 112 113 "using boot CPU:%d\n", smp_processor_id()); 113 - __cpumask_set_cpu(smp_processor_id(), housekeeping_mask); 114 - __cpumask_clear_cpu(smp_processor_id(), non_housekeeping_mask); 115 114 } 115 + } 116 + 117 + if (!housekeeping_flags) { 118 + alloc_bootmem_cpumask_var(&housekeeping_mask); 119 + cpumask_copy(housekeeping_mask, housekeeping_staging); 116 120 } else { 117 - cpumask_andnot(tmp, cpu_present_mask, non_housekeeping_mask); 118 - if (cpumask_empty(tmp)) 119 - __cpumask_clear_cpu(smp_processor_id(), non_housekeeping_mask); 120 - cpumask_andnot(tmp, cpu_possible_mask, non_housekeeping_mask); 121 - if (!cpumask_equal(tmp, housekeeping_mask)) { 121 + if (!cpumask_equal(housekeeping_staging, housekeeping_mask)) { 122 122 pr_warn("Housekeeping: nohz_full= must match isolcpus=\n"); 123 - free_bootmem_cpumask_var(tmp); 123 + free_bootmem_cpumask_var(housekeeping_staging); 124 124 free_bootmem_cpumask_var(non_housekeeping_mask); 125 125 return 0; 126 126 } 127 127 } 128 - free_bootmem_cpumask_var(tmp); 128 + 129 + free_bootmem_cpumask_var(housekeeping_staging); 129 130 130 131 if ((flags & HK_FLAG_TICK) && !(housekeeping_flags & HK_FLAG_TICK)) { 131 132 if (IS_ENABLED(CONFIG_NO_HZ_FULL)) {