@@ -63,32 +63,69 @@ void __init housekeeping_init(void)
6363 WARN_ON_ONCE (cpumask_empty (housekeeping_mask ));
6464}
6565
66- #ifdef CONFIG_NO_HZ_FULL
67- static int __init housekeeping_nohz_full_setup (char * str )
66+ static int __init housekeeping_setup (char * str , enum hk_flags flags )
6867{
6968 cpumask_var_t non_housekeeping_mask ;
69+ int err ;
7070
7171 alloc_bootmem_cpumask_var (& non_housekeeping_mask );
72- if (cpulist_parse (str , non_housekeeping_mask ) < 0 ) {
73- pr_warn ("Housekeeping: Incorrect nohz_full cpumask\n" );
72+ err = cpulist_parse (str , non_housekeeping_mask );
73+ if (err < 0 || cpumask_last (non_housekeeping_mask ) >= nr_cpu_ids ) {
74+ pr_warn ("Housekeeping: nohz_full= or isolcpus= incorrect CPU range\n" );
7475 free_bootmem_cpumask_var (non_housekeeping_mask );
7576 return 0 ;
7677 }
7778
78- alloc_bootmem_cpumask_var (& housekeeping_mask );
79- cpumask_andnot (housekeeping_mask , cpu_possible_mask , non_housekeeping_mask );
80-
81- if (cpumask_empty (housekeeping_mask ))
82- cpumask_set_cpu (smp_processor_id (), housekeeping_mask );
79+ if (!housekeeping_flags ) {
80+ alloc_bootmem_cpumask_var (& housekeeping_mask );
81+ cpumask_andnot (housekeeping_mask ,
82+ cpu_possible_mask , non_housekeeping_mask );
83+ if (cpumask_empty (housekeeping_mask ))
84+ cpumask_set_cpu (smp_processor_id (), housekeeping_mask );
85+ } else {
86+ cpumask_var_t tmp ;
87+
88+ alloc_bootmem_cpumask_var (& tmp );
89+ cpumask_andnot (tmp , cpu_possible_mask , non_housekeeping_mask );
90+ if (!cpumask_equal (tmp , housekeeping_mask )) {
91+ pr_warn ("Housekeeping: nohz_full= must match isolcpus=\n" );
92+ free_bootmem_cpumask_var (tmp );
93+ free_bootmem_cpumask_var (non_housekeeping_mask );
94+ return 0 ;
95+ }
96+ free_bootmem_cpumask_var (tmp );
97+ }
8398
84- housekeeping_flags = HK_FLAG_TICK | HK_FLAG_TIMER |
85- HK_FLAG_RCU | HK_FLAG_MISC ;
99+ if ((flags & HK_FLAG_TICK ) && !(housekeeping_flags & HK_FLAG_TICK )) {
100+ if (IS_ENABLED (CONFIG_NO_HZ_FULL )) {
101+ tick_nohz_full_setup (non_housekeeping_mask );
102+ } else {
103+ pr_warn ("Housekeeping: nohz unsupported."
104+ " Build with CONFIG_NO_HZ_FULL\n" );
105+ free_bootmem_cpumask_var (non_housekeeping_mask );
106+ return 0 ;
107+ }
108+ }
86109
87- tick_nohz_full_setup ( non_housekeeping_mask ) ;
110+ housekeeping_flags |= flags ;
88111
89112 free_bootmem_cpumask_var (non_housekeeping_mask );
90113
91114 return 1 ;
92115}
116+
117+ static int __init housekeeping_nohz_full_setup (char * str )
118+ {
119+ unsigned int flags ;
120+
121+ flags = HK_FLAG_TICK | HK_FLAG_TIMER | HK_FLAG_RCU | HK_FLAG_MISC ;
122+
123+ return housekeeping_setup (str , flags );
124+ }
93125__setup ("nohz_full=" , housekeeping_nohz_full_setup );
94- #endif
126+
127+ static int __init housekeeping_isolcpus_setup (char * str )
128+ {
129+ return housekeeping_setup (str , HK_FLAG_DOMAIN );
130+ }
131+ __setup ("isolcpus=" , housekeeping_isolcpus_setup );
0 commit comments