static int kick_secondary_cpus(int maxcpus) { int cpuid; for_each_present_cpu(cpuid) { int threads; int i; threads = cpu_threads(cpuid); for (i = 0; i < threads; i++) cpu_set(i, cpu_sibling_map[cpuid]); /* For now everything is single core */ cpu_set(cpuid, cpu_core_map[cpuid]); rcu_online_cpu(cpuid); numa_set_node(cpuid, 0); numa_add_cpu(cpuid); if (cpuid == 0) continue; if (cpuid >= maxcpus) break; init_parea(cpuid); smp_generic_give_timebase(); /* wait for it */ while (!cpu_online(cpuid)) cpu_relax(); } return 0; }
static int __cpuinit rcu_cpu_notify(struct notifier_block *self, unsigned long action, void *hcpu) { long cpu = (long)hcpu; switch (action) { case CPU_UP_PREPARE: rcu_online_cpu(cpu); break; case CPU_DEAD: rcu_offline_cpu(cpu); break; default: break; } return NOTIFY_OK; }
void __init rcu_init(void) { rcu_online_cpu(smp_processor_id()); open_softirq(RCU_SOFTIRQ, rcu_process_callbacks); }