On Thu, Aug 11, 2011 at 12:47 PM, Sasha Levin <levinsasha928@xxxxxxxxx> wrote: > This patch changes kvm_cpu__reboot() behaviour to block until all VCPU > threads have ended, this allows us to assume that the guest is stopped > when the function has returned. > > This fixes errors on close caused by releasing KVM_RUN structure while > VCPUs were still running. > > Signed-off-by: Sasha Levin <levinsasha928@xxxxxxxxx> > --- > tools/kvm/kvm-cpu.c | 10 ++++++++-- > 1 files changed, 8 insertions(+), 2 deletions(-) > > diff --git a/tools/kvm/kvm-cpu.c b/tools/kvm/kvm-cpu.c > index 2f5d23c..64c0997 100644 > --- a/tools/kvm/kvm-cpu.c > +++ b/tools/kvm/kvm-cpu.c > @@ -421,7 +421,13 @@ static void kvm_cpu__handle_coalesced_mmio(struct kvm_cpu *cpu) > > void kvm_cpu__reboot(void) > { > - pthread_kill(kvm_cpus[0]->thread, SIGKVMEXIT); > + int i; > + > + for (i = 0; i < KVM_NR_CPUS; i++) > + if (kvm_cpus[i]) { > + pthread_kill(kvm_cpus[i]->thread, SIGKVMEXIT); > + pthread_join(kvm_cpus[i]->thread, NULL); > + } Wouldn't it be better to first pthread_kill() all CPUs first and do pthread_join() in separate loop? That should be faster especially if there's lots of CPUs. > } > > int kvm_cpu__start(struct kvm_cpu *cpu) > @@ -442,7 +448,7 @@ int kvm_cpu__start(struct kvm_cpu *cpu) > if (cpu->kvm->single_step) > kvm_cpu__enable_singlestep(cpu); > > - for (;;) { > + while (cpu->is_running) { > if (cpu->paused) { > kvm__notify_paused(); > cpu->paused = 0; > -- > 1.7.6 > > -- > To unsubscribe from this list: send the line "unsubscribe kvm" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html