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));
|
} while (!cpu->unplug || cpu_can_run(cpu));
|
||||||
|
|
||||||
qemu_kvm_destroy_vcpu(cpu);
|
qemu_kvm_destroy_vcpu(cpu);
|
||||||
|
cpu->created = false;
|
||||||
|
qemu_cond_signal(&qemu_cpu_cond);
|
||||||
qemu_mutex_unlock_iothread();
|
qemu_mutex_unlock_iothread();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -1184,6 +1186,8 @@ static void *qemu_tcg_cpu_thread_fn(void *arg)
|
|||||||
}
|
}
|
||||||
if (remove_cpu) {
|
if (remove_cpu) {
|
||||||
qemu_tcg_destroy_vcpu(remove_cpu);
|
qemu_tcg_destroy_vcpu(remove_cpu);
|
||||||
|
cpu->created = false;
|
||||||
|
qemu_cond_signal(&qemu_cpu_cond);
|
||||||
remove_cpu = NULL;
|
remove_cpu = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1349,6 +1353,14 @@ void cpu_remove(CPUState *cpu)
|
|||||||
qemu_cpu_kick(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 */
|
/* For temporary buffers for forming a name */
|
||||||
#define VCPU_THREAD_NAME_SIZE 16
|
#define VCPU_THREAD_NAME_SIZE 16
|
||||||
|
|
||||||
|
@ -772,6 +772,14 @@ void cpu_resume(CPUState *cpu);
|
|||||||
*/
|
*/
|
||||||
void cpu_remove(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:
|
* qemu_init_vcpu:
|
||||||
* @cpu: The vCPU to initialize.
|
* @cpu: The vCPU to initialize.
|
||||||
|
Loading…
Reference in New Issue
Block a user