@@ -1210,34 +1210,45 @@ EXPORT_SYMBOL_GPL(rcu_nocb_cpu_offload);
12101210void __init rcu_init_nohz (void )
12111211{
12121212 int cpu ;
1213+ bool need_rcu_nocb_mask = false;
1214+ bool offload_all = false;
12131215 struct rcu_data * rdp ;
1214- const struct cpumask * cpumask = NULL ;
1215-
1216- #if defined(CONFIG_NO_HZ_FULL )
1217- if (tick_nohz_full_running && !cpumask_empty (tick_nohz_full_mask ))
1218- cpumask = tick_nohz_full_mask ;
1219- #endif
12201216
12211217#if defined(CONFIG_RCU_NOCB_CPU_DEFAULT_ALL )
1222- if (!rcu_state .nocb_is_setup && !cpumask )
1223- cpumask = cpu_possible_mask ;
1224- #endif
1218+ if (!rcu_state .nocb_is_setup ) {
1219+ need_rcu_nocb_mask = true;
1220+ offload_all = true;
1221+ }
1222+ #endif /* #if defined(CONFIG_RCU_NOCB_CPU_DEFAULT_ALL) */
1223+
1224+ #if defined(CONFIG_NO_HZ_FULL )
1225+ if (tick_nohz_full_running && !cpumask_empty (tick_nohz_full_mask )) {
1226+ need_rcu_nocb_mask = true;
1227+ offload_all = false; /* NO_HZ_FULL has its own mask. */
1228+ }
1229+ #endif /* #if defined(CONFIG_NO_HZ_FULL) */
12251230
1226- if (cpumask ) {
1231+ if (need_rcu_nocb_mask ) {
12271232 if (!cpumask_available (rcu_nocb_mask )) {
12281233 if (!zalloc_cpumask_var (& rcu_nocb_mask , GFP_KERNEL )) {
12291234 pr_info ("rcu_nocb_mask allocation failed, callback offloading disabled.\n" );
12301235 return ;
12311236 }
12321237 }
1233-
1234- cpumask_or (rcu_nocb_mask , rcu_nocb_mask , cpumask );
12351238 rcu_state .nocb_is_setup = true;
12361239 }
12371240
12381241 if (!rcu_state .nocb_is_setup )
12391242 return ;
12401243
1244+ #if defined(CONFIG_NO_HZ_FULL )
1245+ if (tick_nohz_full_running )
1246+ cpumask_or (rcu_nocb_mask , rcu_nocb_mask , tick_nohz_full_mask );
1247+ #endif /* #if defined(CONFIG_NO_HZ_FULL) */
1248+
1249+ if (offload_all )
1250+ cpumask_setall (rcu_nocb_mask );
1251+
12411252 if (!cpumask_subset (rcu_nocb_mask , cpu_possible_mask )) {
12421253 pr_info ("\tNote: kernel parameter 'rcu_nocbs=', 'nohz_full', or 'isolcpus=' contains nonexistent CPUs.\n" );
12431254 cpumask_and (rcu_nocb_mask , cpu_possible_mask ,
0 commit comments