fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / arch / sh / kernel / smp.c
index 97ed434..dbebadd 100644 (file)
@@ -10,7 +10,6 @@
  * Free Software Foundation; either version 2 of the License, or (at your
  * option) any later version.
  */
-#include <linux/config.h>
 #include <linux/cache.h>
 #include <linux/cpumask.h>
 #include <linux/delay.h>
 #include <linux/time.h>
 #include <linux/timex.h>
 #include <linux/sched.h>
+#include <linux/module.h>
 
 #include <asm/atomic.h>
 #include <asm/processor.h>
 #include <asm/system.h>
-#include <asm/hardirq.h>
 #include <asm/mmu_context.h>
 #include <asm/smp.h>
 
  * 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;
+EXPORT_SYMBOL(cpu_online_map);
 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(&regs, 0, sizeof(struct pt_regs));
-       tsk = copy_process(CLONE_VM | CLONE_IDLETASK, 0, &regs, 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);