On Fri, Sep 04, 2015 at 04:11:38PM +1000, David Gibson wrote: > On Thu, Aug 06, 2015 at 10:57:10AM +0530, Bharata B Rao wrote: > > 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 <bhar...@linux.vnet.ibm.com> > > --- > > cpus.c | 14 ++++++++++++++ > > include/qom/cpu.h | 8 ++++++++ > > 2 files changed, 22 insertions(+) > > > > diff --git a/cpus.c b/cpus.c > > index 73ae2e7..9d9644e 100644 > > --- a/cpus.c > > +++ b/cpus.c > > @@ -999,6 +999,8 @@ static void *qemu_kvm_cpu_thread_fn(void *arg) > > qemu_kvm_wait_io_event(cpu); > > if (cpu->exit && !cpu_can_run(cpu)) { > > qemu_kvm_destroy_vcpu(cpu); > > + cpu->created = false; > > + qemu_cond_signal(&qemu_cpu_cond); > > qemu_mutex_unlock(&qemu_global_mutex); > > return NULL; > > } > > @@ -1104,6 +1106,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; > > } > > } > > @@ -1283,6 +1287,16 @@ void cpu_remove(CPUState *cpu) > > qemu_cpu_kick(cpu); > > } > > > > +void cpu_remove_sync(CPUState *cpu) > > +{ > > + cpu->stop = true; > > + cpu->exit = true; > > + qemu_cpu_kick(cpu); > > It would be nicer for this to call the async cpu_remove() above, to > ensure they stay in sync.
Makes sense, will incorporate this in the next iteration. Regards, Bharata.