Commit 1c59eb39 authored by Bharata B Rao's avatar Bharata B Rao Committed by David Gibson
Browse files

exec: Remove cpu from cpus list during cpu_exec_exit()



CPUState *cpu gets added to the cpus list during cpu_exec_init(). It
should be removed from cpu_exec_exit().

cpu_exec_exit() is called from generic CPU::instance_finalize and some
archs like PowerPC call it from CPU unrealizefn. So ensure that we
dequeue the cpu only once.

Now -1 value for cpu->cpu_index indicates that we have already dequeued
the cpu for CONFIG_USER_ONLY case also.

Signed-off-by: default avatarBharata B Rao <bharata@linux.vnet.ibm.com>
Reviewed-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
Reviewed-by: default avatarThomas Huth <thuth@redhat.com>
Acked-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Signed-off-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
parent 4e080611
Loading
Loading
Loading
Loading
+24 −8
Original line number Diff line number Diff line
@@ -612,15 +612,9 @@ static int cpu_get_free_index(Error **errp)
    return cpu;
}

void cpu_exec_exit(CPUState *cpu)
static void cpu_release_index(CPUState *cpu)
{
    if (cpu->cpu_index == -1) {
        /* cpu_index was never allocated by this @cpu or was already freed. */
        return;
    }

    bitmap_clear(cpu_index_map, cpu->cpu_index, 1);
    cpu->cpu_index = -1;
}
#else

@@ -635,10 +629,32 @@ static int cpu_get_free_index(Error **errp)
    return cpu_index;
}

static void cpu_release_index(CPUState *cpu)
{
    return;
}
#endif

void cpu_exec_exit(CPUState *cpu)
{
#if defined(CONFIG_USER_ONLY)
    cpu_list_lock();
#endif
    if (cpu->cpu_index == -1) {
        /* cpu_index was never allocated by this @cpu or was already freed. */
#if defined(CONFIG_USER_ONLY)
        cpu_list_unlock();
#endif
        return;
    }

    QTAILQ_REMOVE(&cpus, cpu, node);
    cpu_release_index(cpu);
    cpu->cpu_index = -1;
#if defined(CONFIG_USER_ONLY)
    cpu_list_unlock();
#endif
}

void cpu_exec_init(CPUState *cpu, Error **errp)
{