diff options
Diffstat (limited to 'arch/parisc/kernel/smp.c')
| -rw-r--r-- | arch/parisc/kernel/smp.c | 33 | 
1 files changed, 10 insertions, 23 deletions
diff --git a/arch/parisc/kernel/smp.c b/arch/parisc/kernel/smp.c index 0bb1d63907f..a47828d31fe 100644 --- a/arch/parisc/kernel/smp.c +++ b/arch/parisc/kernel/smp.c @@ -31,6 +31,7 @@  #include <linux/delay.h>  #include <linux/bitops.h>  #include <linux/ftrace.h> +#include <linux/cpu.h>  #include <linux/atomic.h>  #include <asm/current.h> @@ -295,8 +296,13 @@ smp_cpu_init(int cpunum)  		printk(KERN_CRIT "CPU#%d already initialized!\n", cpunum);  		machine_halt(); -	}   +	} + +	notify_cpu_starting(cpunum); + +	ipi_call_lock();  	set_cpu_online(cpunum, true); +	ipi_call_unlock();  	/* Initialise the idle task for this CPU */  	atomic_inc(&init_mm.mm_count); @@ -334,26 +340,11 @@ void __init smp_callin(void)  /*   * Bring one cpu online.   */ -int __cpuinit smp_boot_one_cpu(int cpuid) +int __cpuinit smp_boot_one_cpu(int cpuid, struct task_struct *idle)  {  	const struct cpuinfo_parisc *p = &per_cpu(cpu_data, cpuid); -	struct task_struct *idle;  	long timeout; -	/*  -	 * Create an idle task for this CPU.  Note the address wed* give  -	 * to kernel_thread is irrelevant -- it's going to start -	 * where OS_BOOT_RENDEVZ vector in SAL says to start.  But -	 * this gets all the other task-y sort of data structures set -	 * up like we wish.   We need to pull the just created idle task  -	 * off the run queue and stuff it into the init_tasks[] array.   -	 * Sheesh . . . -	 */ - -	idle = fork_idle(cpuid); -	if (IS_ERR(idle)) -		panic("SMP: fork failed for CPU:%d", cpuid); -  	task_thread_info(idle)->cpu = cpuid;  	/* Let _start know what logical CPU we're booting @@ -397,10 +388,6 @@ int __cpuinit smp_boot_one_cpu(int cpuid)  		udelay(100);  		barrier();  	} - -	put_task_struct(idle); -	idle = NULL; -  	printk(KERN_CRIT "SMP: CPU:%d is stuck.\n", cpuid);  	return -1; @@ -449,10 +436,10 @@ void smp_cpus_done(unsigned int cpu_max)  } -int __cpuinit __cpu_up(unsigned int cpu) +int __cpuinit __cpu_up(unsigned int cpu, struct task_struct *tidle)  {  	if (cpu != 0 && cpu < parisc_max_cpus) -		smp_boot_one_cpu(cpu); +		smp_boot_one_cpu(cpu, tidle);  	return cpu_online(cpu) ? 0 : -ENOSYS;  }  |