@@ -65,6 +65,7 @@ void __init housekeeping_init(void)
65
65
static int __init housekeeping_setup (char * str , enum hk_flags flags )
66
66
{
67
67
cpumask_var_t non_housekeeping_mask ;
68
+ cpumask_var_t tmp ;
68
69
int err ;
69
70
70
71
alloc_bootmem_cpumask_var (& non_housekeeping_mask );
@@ -75,25 +76,32 @@ static int __init housekeeping_setup(char *str, enum hk_flags flags)
75
76
return 0 ;
76
77
}
77
78
79
+ alloc_bootmem_cpumask_var (& tmp );
78
80
if (!housekeeping_flags ) {
79
81
alloc_bootmem_cpumask_var (& housekeeping_mask );
80
82
cpumask_andnot (housekeeping_mask ,
81
83
cpu_possible_mask , non_housekeeping_mask );
82
- if (cpumask_empty (housekeeping_mask ))
84
+
85
+ cpumask_andnot (tmp , cpu_present_mask , non_housekeeping_mask );
86
+ if (cpumask_empty (tmp )) {
87
+ pr_warn ("Housekeeping: must include one present CPU, "
88
+ "using boot CPU:%d\n" , smp_processor_id ());
83
89
__cpumask_set_cpu (smp_processor_id (), housekeeping_mask );
90
+ __cpumask_clear_cpu (smp_processor_id (), non_housekeeping_mask );
91
+ }
84
92
} else {
85
- cpumask_var_t tmp ;
86
-
87
- alloc_bootmem_cpumask_var ( & tmp );
93
+ cpumask_andnot ( tmp , cpu_present_mask , non_housekeeping_mask ) ;
94
+ if ( cpumask_empty ( tmp ))
95
+ __cpumask_clear_cpu ( smp_processor_id (), non_housekeeping_mask );
88
96
cpumask_andnot (tmp , cpu_possible_mask , non_housekeeping_mask );
89
97
if (!cpumask_equal (tmp , housekeeping_mask )) {
90
98
pr_warn ("Housekeeping: nohz_full= must match isolcpus=\n" );
91
99
free_bootmem_cpumask_var (tmp );
92
100
free_bootmem_cpumask_var (non_housekeeping_mask );
93
101
return 0 ;
94
102
}
95
- free_bootmem_cpumask_var (tmp );
96
103
}
104
+ free_bootmem_cpumask_var (tmp );
97
105
98
106
if ((flags & HK_FLAG_TICK ) && !(housekeeping_flags & HK_FLAG_TICK )) {
99
107
if (IS_ENABLED (CONFIG_NO_HZ_FULL )) {
0 commit comments