diff options
Diffstat (limited to 'kernel/sched/isolation.c')
| -rw-r--r-- | kernel/sched/isolation.c | 18 | 
1 files changed, 13 insertions, 5 deletions
diff --git a/kernel/sched/isolation.c b/kernel/sched/isolation.c index b02d148e7672..687302051a27 100644 --- a/kernel/sched/isolation.c +++ b/kernel/sched/isolation.c @@ -65,6 +65,7 @@ void __init housekeeping_init(void)  static int __init housekeeping_setup(char *str, enum hk_flags flags)  {  	cpumask_var_t non_housekeeping_mask; +	cpumask_var_t tmp;  	int err;  	alloc_bootmem_cpumask_var(&non_housekeeping_mask); @@ -75,16 +76,23 @@ static int __init housekeeping_setup(char *str, enum hk_flags flags)  		return 0;  	} +	alloc_bootmem_cpumask_var(&tmp);  	if (!housekeeping_flags) {  		alloc_bootmem_cpumask_var(&housekeeping_mask);  		cpumask_andnot(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_clear_cpu(smp_processor_id(), non_housekeeping_mask); +		}  	} else { -		cpumask_var_t tmp; - -		alloc_bootmem_cpumask_var(&tmp); +		cpumask_andnot(tmp, cpu_present_mask, non_housekeeping_mask); +		if (cpumask_empty(tmp)) +			__cpumask_clear_cpu(smp_processor_id(), non_housekeeping_mask);  		cpumask_andnot(tmp, cpu_possible_mask, non_housekeeping_mask);  		if (!cpumask_equal(tmp, housekeeping_mask)) {  			pr_warn("Housekeeping: nohz_full= must match isolcpus=\n"); @@ -92,8 +100,8 @@ static int __init housekeeping_setup(char *str, enum hk_flags flags)  			free_bootmem_cpumask_var(non_housekeeping_mask);  			return 0;  		} -		free_bootmem_cpumask_var(tmp);  	} +	free_bootmem_cpumask_var(tmp);  	if ((flags & HK_FLAG_TICK) && !(housekeeping_flags & HK_FLAG_TICK)) {  		if (IS_ENABLED(CONFIG_NO_HZ_FULL)) {  |