diff options
Diffstat (limited to 'arch/s390/kernel/smp.c')
| -rw-r--r-- | arch/s390/kernel/smp.c | 39 | 
1 files changed, 7 insertions, 32 deletions
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index 1f77227669e..647ba942589 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c @@ -85,7 +85,6 @@ enum {  struct pcpu {  	struct cpu cpu; -	struct task_struct *idle;	/* idle process for the cpu */  	struct _lowcore *lowcore;	/* lowcore page(s) for the cpu */  	unsigned long async_stack;	/* async stack for the cpu */  	unsigned long panic_stack;	/* panic stack for the cpu */ @@ -226,6 +225,8 @@ out:  	return -ENOMEM;  } +#ifdef CONFIG_HOTPLUG_CPU +  static void pcpu_free_lowcore(struct pcpu *pcpu)  {  	pcpu_sigp_retry(pcpu, sigp_set_prefix, 0); @@ -247,6 +248,8 @@ static void pcpu_free_lowcore(struct pcpu *pcpu)  	}  } +#endif /* CONFIG_HOTPLUG_CPU */ +  static void pcpu_prepare_secondary(struct pcpu *pcpu, int cpu)  {  	struct _lowcore *lc = pcpu->lowcore; @@ -721,26 +724,9 @@ static void __cpuinit smp_start_secondary(void *cpuvoid)  	cpu_idle();  } -struct create_idle { -	struct work_struct work; -	struct task_struct *idle; -	struct completion done; -	int cpu; -}; - -static void __cpuinit smp_fork_idle(struct work_struct *work) -{ -	struct create_idle *c_idle; - -	c_idle = container_of(work, struct create_idle, work); -	c_idle->idle = fork_idle(c_idle->cpu); -	complete(&c_idle->done); -} -  /* Upping and downing of CPUs */ -int __cpuinit __cpu_up(unsigned int cpu) +int __cpuinit __cpu_up(unsigned int cpu, struct task_struct *tidle)  { -	struct create_idle c_idle;  	struct pcpu *pcpu;  	int rc; @@ -750,22 +736,12 @@ int __cpuinit __cpu_up(unsigned int cpu)  	if (pcpu_sigp_retry(pcpu, sigp_initial_cpu_reset, 0) !=  	    sigp_order_code_accepted)  		return -EIO; -	if (!pcpu->idle) { -		c_idle.done = COMPLETION_INITIALIZER_ONSTACK(c_idle.done); -		INIT_WORK_ONSTACK(&c_idle.work, smp_fork_idle); -		c_idle.cpu = cpu; -		schedule_work(&c_idle.work); -		wait_for_completion(&c_idle.done); -		if (IS_ERR(c_idle.idle)) -			return PTR_ERR(c_idle.idle); -		pcpu->idle = c_idle.idle; -	} -	init_idle(pcpu->idle, cpu); +  	rc = pcpu_alloc_lowcore(pcpu, cpu);  	if (rc)  		return rc;  	pcpu_prepare_secondary(pcpu, cpu); -	pcpu_attach_task(pcpu, pcpu->idle); +	pcpu_attach_task(pcpu, tidle);  	pcpu_start_fn(pcpu, smp_start_secondary, NULL);  	while (!cpu_online(cpu))  		cpu_relax(); @@ -852,7 +828,6 @@ void __init smp_prepare_boot_cpu(void)  	struct pcpu *pcpu = pcpu_devices;  	boot_cpu_address = stap(); -	pcpu->idle = current;  	pcpu->state = CPU_STATE_CONFIGURED;  	pcpu->address = boot_cpu_address;  	pcpu->lowcore = (struct _lowcore *)(unsigned long) store_prefix();  |