From: Rusty Russell When CPUs are going down, there is a time when cpu_online(cpu) is false, but they are still scheduling and responding to interrupts (we are migrating things off the CPU, shutting down per-cpu threads, etc). It turns out that RCU cares about these CPUs, so the decision was made to expose this mask (previously internal to x86, and only used for IPIs). The semantics of this mask are as follows: 1) For platforms without hot unplug of CPUs: cpu_active_map == cpu_online_map. 2) For the others, they are equal except for a CPU which is going down: cpu_online_map gets cleared by __cpu_disable(), cpu_ipi_map gets cleared in __cpu_die() once the CPU is no longer responding to interrupts. --- include/linux/cpumask.h | 7 +++++++ kernel/rcupdate.c | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff -puN include/linux/cpumask.h~cpuhotplug-01-cpu_active_map include/linux/cpumask.h --- 25/include/linux/cpumask.h~cpuhotplug-01-cpu_active_map 2004-01-31 15:15:47.000000000 -0800 +++ 25-akpm/include/linux/cpumask.h 2004-01-31 15:15:47.000000000 -0800 @@ -11,6 +11,13 @@ extern cpumask_t cpu_online_map; extern cpumask_t cpu_possible_map; +#ifdef CONFIG_HOTPLUG_CPU +/* Online, or on its way down but still receiving interrupts. */ +extern cpumask_t cpu_active_map; +#else +#define cpu_active_map cpu_online_map +#endif + #define num_online_cpus() cpus_weight(cpu_online_map) #define cpu_online(cpu) cpu_isset(cpu, cpu_online_map) #define cpu_possible(cpu) cpu_isset(cpu, cpu_possible_map) diff -puN kernel/rcupdate.c~cpuhotplug-01-cpu_active_map kernel/rcupdate.c --- 25/kernel/rcupdate.c~cpuhotplug-01-cpu_active_map 2004-01-31 15:15:47.000000000 -0800 +++ 25-akpm/kernel/rcupdate.c 2004-01-31 15:15:47.000000000 -0800 @@ -110,7 +110,7 @@ static void rcu_start_batch(long newbatc !cpus_empty(rcu_ctrlblk.rcu_cpu_mask)) { return; } - rcu_ctrlblk.rcu_cpu_mask = cpu_online_map; + rcu_ctrlblk.rcu_cpu_mask = cpu_active_map; } /* _