diff options
| -rw-r--r-- | arch/s390/kernel/smp.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index 1f4711b60aab..fe5f8dc1e6fa 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c | |||
| @@ -534,18 +534,23 @@ int __cpuinit __cpu_up(unsigned int cpu) | |||
| 534 | struct _lowcore *cpu_lowcore; | 534 | struct _lowcore *cpu_lowcore; |
| 535 | struct stack_frame *sf; | 535 | struct stack_frame *sf; |
| 536 | sigp_ccode ccode; | 536 | sigp_ccode ccode; |
| 537 | u32 lowcore; | ||
| 537 | 538 | ||
| 538 | if (smp_cpu_state[cpu] != CPU_STATE_CONFIGURED) | 539 | if (smp_cpu_state[cpu] != CPU_STATE_CONFIGURED) |
| 539 | return -EIO; | 540 | return -EIO; |
| 540 | if (smp_alloc_lowcore(cpu)) | 541 | if (smp_alloc_lowcore(cpu)) |
| 541 | return -ENOMEM; | 542 | return -ENOMEM; |
| 542 | 543 | do { | |
| 543 | ccode = signal_processor_p((__u32)(unsigned long)(lowcore_ptr[cpu]), | 544 | ccode = signal_processor(cpu, sigp_initial_cpu_reset); |
| 544 | cpu, sigp_set_prefix); | 545 | if (ccode == sigp_busy) |
| 545 | if (ccode) { | 546 | udelay(10); |
| 546 | smp_free_lowcore(cpu); | 547 | if (ccode == sigp_not_operational) |
| 547 | return -EIO; | 548 | goto err_out; |
| 548 | } | 549 | } while (ccode == sigp_busy); |
| 550 | |||
| 551 | lowcore = (u32)(unsigned long)lowcore_ptr[cpu]; | ||
| 552 | while (signal_processor_p(lowcore, cpu, sigp_set_prefix) == sigp_busy) | ||
| 553 | udelay(10); | ||
| 549 | 554 | ||
| 550 | idle = current_set[cpu]; | 555 | idle = current_set[cpu]; |
| 551 | cpu_lowcore = lowcore_ptr[cpu]; | 556 | cpu_lowcore = lowcore_ptr[cpu]; |
| @@ -574,6 +579,10 @@ int __cpuinit __cpu_up(unsigned int cpu) | |||
| 574 | while (!cpu_online(cpu)) | 579 | while (!cpu_online(cpu)) |
| 575 | cpu_relax(); | 580 | cpu_relax(); |
| 576 | return 0; | 581 | return 0; |
| 582 | |||
| 583 | err_out: | ||
| 584 | smp_free_lowcore(cpu); | ||
| 585 | return -EIO; | ||
| 577 | } | 586 | } |
| 578 | 587 | ||
| 579 | static int __init setup_possible_cpus(char *s) | 588 | static int __init setup_possible_cpus(char *s) |
