spin_lock(&vector_lock);
/* Setup the per cpu irq handling data structures */
__setup_vector_irq(cpuid);
++ + notify_cpu_starting(cpuid);
cpu_set(cpuid, cpu_online_map);
per_cpu(cpu_state, cpuid) = CPU_ONLINE;
spin_unlock(&vector_lock);
return -EBUSY;
}
- cpu_clear(cpu, cpu_online_map);
-
if (migrate_platform_irqs(cpu)) {
cpu_set(cpu, cpu_online_map);
return (-EBUSY);
}
remove_siblinginfo(cpu);
- cpu_clear(cpu, cpu_online_map);
fixup_irqs();
+ cpu_clear(cpu, cpu_online_map);
local_flush_tlb_all();
cpu_clear(cpu, cpu_callin_map);
return 0;
struct take_cpu_down_param *param = _param;
int err;
- -- raw_notifier_call_chain(&cpu_chain, CPU_DYING | param->mod,
- -- param->hcpu);
/* Ensure this CPU doesn't handle any more interrupts. */
err = __cpu_disable();
if (err < 0)
return err;
+ ++ raw_notifier_call_chain(&cpu_chain, CPU_DYING | param->mod,
+ ++ param->hcpu);
+ ++
/* Force idle task to run as soon as we yield: it should
immediately notice cpu is offline and die quickly. */
sched_idle_next();
}
#endif /* CONFIG_PM_SLEEP_SMP */
++ +/**
++ + * notify_cpu_starting(cpu) - call the CPU_STARTING notifiers
++ + * @cpu: cpu that just started
++ + *
++ + * This function calls the cpu_chain notifiers with CPU_STARTING.
++ + * It must be called by the arch code on the new cpu, before the new cpu
++ + * enables interrupts and before the "boot" cpu returns from __cpu_up().
++ + */
++ +void notify_cpu_starting(unsigned int cpu)
++ +{
++ + unsigned long val = CPU_STARTING;
++ +
++ +#ifdef CONFIG_PM_SLEEP_SMP
++ + if (cpu_isset(cpu, frozen_cpus))
++ + val = CPU_STARTING_FROZEN;
++ +#endif /* CONFIG_PM_SLEEP_SMP */
++ + raw_notifier_call_chain(&cpu_chain, val, (void *)(long)cpu);
++ +}
++ +
#endif /* CONFIG_SMP */
/*