[Skiboot] [PATCH] cpu: Fix hang issue in opal_reinit_cpus()
Benjamin Herrenschmidt
benh at au1.ibm.com
Fri Jun 12 15:44:20 AEST 2015
On Thu, 2015-06-11 at 16:37 +0530, Hari Bathini wrote:
> Commit 87690bd19dbb introduced a label "again" so as to avoid holding
> the lock while waiting. But this leads to hang in scenarios like kdump,
> where 'cpu_state_os' will be the state for all offline cpus. Actaully,
> the wait loop doesn't really take off with the goto statement in it.
> This patch tries to fix this problem by removing the goto statement
> and unlocking/locking within the wait loop instead.
That means that kdump cannot change the endian state, is that ok ?
Cheers,
Ben.
> Signed-off-by: Hari Bathini <hbathini at linux.vnet.ibm.com>
> ---
> core/cpu.c | 3 +--
> 1 file changed, 1 insertion(+), 2 deletions(-)
>
> diff --git a/core/cpu.c b/core/cpu.c
> index 6812ff0..cdf84ac 100644
> --- a/core/cpu.c
> +++ b/core/cpu.c
> @@ -695,7 +695,6 @@ static int64_t opal_reinit_cpus(uint64_t flags)
>
> prerror("OPAL: Trying a CPU re-init with flags: 0x%llx\n", flags);
>
> - again:
> lock(&reinit_lock);
>
> for (cpu = first_cpu(); cpu; cpu = next_cpu(cpu)) {
> @@ -710,7 +709,7 @@ static int64_t opal_reinit_cpus(uint64_t flags)
> (cpu->state == cpu_state_os); i++) {
> unlock(&reinit_lock);
> time_wait_ms(1);
> - goto again;
> + lock(&reinit_lock);
> }
> if (cpu->state == cpu_state_os) {
> prerror("OPAL: CPU 0x%x not in OPAL !\n", cpu->pir);
More information about the Skiboot
mailing list