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 <bharata@linux.vnet.ibm.com> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Acked-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
4c055ab54f
commit
2c579042e3
12
cpus.c
12
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
|
||||
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user