#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>
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;
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;
cpu_set(cpu, cpu_online_map);
atomic_inc(&cpus_booted);
- return cpu_idle(0);
+ cpu_idle();
+ return 0;
}
void __init smp_cpus_done(unsigned int max_cpus)
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);