From: Bharata B Rao Date: Thu, 12 May 2016 03:48:14 +0000 (+0530) Subject: cpu: Add a sync version of cpu_remove() X-Git-Tag: TizenStudio_2.0_p4.0~6^2~12^2~6^2~242^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2c579042e3be50bb40a233a6986348b4f40ed026;p=sdk%2Femulator%2Fqemu.git cpu: Add a sync version of cpu_remove() This sync API will be used by the CPU hotplug code to wait for the CPU to completely get removed before flagging the failure to the device_add command. Sync version of this call is needed to correctly recover from CPU realization failures when ->plug() handler fails. Signed-off-by: Bharata B Rao Reviewed-by: David Gibson Acked-by: Paolo Bonzini Signed-off-by: David Gibson --- diff --git a/cpus.c b/cpus.c index 3e3ef95..326742f 100644 --- a/cpus.c +++ b/cpus.c @@ -1084,6 +1084,8 @@ static void *qemu_kvm_cpu_thread_fn(void *arg) } while (!cpu->unplug || cpu_can_run(cpu)); qemu_kvm_destroy_vcpu(cpu); + cpu->created = false; + qemu_cond_signal(&qemu_cpu_cond); qemu_mutex_unlock_iothread(); return NULL; } @@ -1184,6 +1186,8 @@ static void *qemu_tcg_cpu_thread_fn(void *arg) } if (remove_cpu) { qemu_tcg_destroy_vcpu(remove_cpu); + cpu->created = false; + qemu_cond_signal(&qemu_cpu_cond); remove_cpu = NULL; } } @@ -1349,6 +1353,14 @@ void cpu_remove(CPUState *cpu) qemu_cpu_kick(cpu); } +void cpu_remove_sync(CPUState *cpu) +{ + cpu_remove(cpu); + while (cpu->created) { + qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex); + } +} + /* For temporary buffers for forming a name */ #define VCPU_THREAD_NAME_SIZE 16 diff --git a/include/qom/cpu.h b/include/qom/cpu.h index 3b57757..32f3af3 100644 --- a/include/qom/cpu.h +++ b/include/qom/cpu.h @@ -772,6 +772,14 @@ void cpu_resume(CPUState *cpu); */ void cpu_remove(CPUState *cpu); + /** + * cpu_remove_sync: + * @cpu: The CPU to remove. + * + * Requests the CPU to be removed and waits till it is removed. + */ +void cpu_remove_sync(CPUState *cpu); + /** * qemu_init_vcpu: * @cpu: The vCPU to initialize.