X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fsh%2Fkernel%2Fsmp.c;h=62c7d1c0ad7bd2a0f1070c731e5f63a4156e8384;hb=9464c7cf61b9433057924c36e6e02f303a00e768;hp=97ed4345f30661ecfc4bf44ffbbabb9c36a96dcc;hpb=daddc0d38b3571bed170afa273a49a0eba090c1e;p=linux-2.6.git diff --git a/arch/sh/kernel/smp.c b/arch/sh/kernel/smp.c index 97ed4345f..62c7d1c0a 100644 --- a/arch/sh/kernel/smp.c +++ b/arch/sh/kernel/smp.c @@ -22,11 +22,11 @@ #include #include #include +#include #include #include #include -#include #include #include @@ -35,15 +35,14 @@ * but is designed to be usable regardless if there's an MMU * present or not. */ -int smp_threads_ready = 0; struct sh_cpuinfo cpu_data[NR_CPUS]; -extern int cpu_idle(void *unused); extern void per_cpu_trap_init(void); cpumask_t cpu_possible_map; +EXPORT_SYMBOL(cpu_possible_map); + cpumask_t cpu_online_map; -unsigned long cache_decay_ticks = HZ / 100; static atomic_t cpus_booted = ATOMIC_INIT(0); /* These are defined by the board-specific code. */ @@ -98,20 +97,13 @@ void __devinit smp_prepare_boot_cpu(void) int __cpu_up(unsigned int cpu) { struct task_struct *tsk; - struct pt_regs regs; - memset(®s, 0, sizeof(struct pt_regs)); - tsk = copy_process(CLONE_VM | CLONE_IDLETASK, 0, ®s, 0, 0, 0); + tsk = fork_idle(cpu); if (IS_ERR(tsk)) panic("Failed forking idle task for cpu %d\n", cpu); - wake_up_forked_process(tsk); - - init_idle(tsk, cpu); - unhash_process(tsk); - - tsk->thread_info->cpu = cpu; + task_thread_info(tsk)->cpu = cpu; cpu_set(cpu, cpu_online_map); @@ -120,7 +112,9 @@ int __cpu_up(unsigned int cpu) int start_secondary(void *unused) { - unsigned int cpu = smp_processor_id(); + unsigned int cpu; + + cpu = smp_processor_id(); atomic_inc(&init_mm.mm_count); current->active_mm = &init_mm; @@ -128,16 +122,17 @@ int start_secondary(void *unused) smp_store_cpu_info(cpu); __smp_slave_init(cpu); + preempt_disable(); per_cpu_trap_init(); atomic_inc(&cpus_booted); - return cpu_idle(0); + cpu_idle(); + return 0; } void __init smp_cpus_done(unsigned int max_cpus) { - smp_threads_ready = 1; smp_mb(); } @@ -181,6 +176,9 @@ int smp_call_function(void (*func)(void *info), void *info, int retry, int wait) if (nr_cpus < 2) return 0; + /* Can deadlock when called with interrupts disabled */ + WARN_ON(irqs_disabled()); + spin_lock(&smp_fn_call.lock); atomic_set(&smp_fn_call.finished, 0);