Re: [Qemu-devel] [PATCH v2 2/8] Allow to use pause_all_vcpus from VCPU context
On Fri, Feb 10, 2012 at 18:31, Jan Kiszka jan.kis...@siemens.com wrote: In order to perform critical manipulations on the VM state in the context of a VCPU, specifically code patching, stopping and resuming of all VCPUs may be necessary. resume_all_vcpus is already compatible, now enable pause_all_vcpus for this use case by stopping the calling context before starting to wait for the whole gang. CC: Paolo Bonzini pbonz...@redhat.com Signed-off-by: Jan Kiszka jan.kis...@siemens.com --- cpus.c | 12 1 files changed, 12 insertions(+), 0 deletions(-) diff --git a/cpus.c b/cpus.c index d0c8340..5adfc6b 100644 --- a/cpus.c +++ b/cpus.c @@ -870,6 +870,18 @@ void pause_all_vcpus(void) penv = (CPUState *)penv-next_cpu; } + if (!qemu_thread_is_self(io_thread)) { + cpu_stop_current(); + if (!kvm_enabled()) { + while (penv) { + penv-stop = 0; + penv-stopped = 1; + penv = (CPUState *)penv-next_cpu; The cast is useless, next_cpu is already CPUState *. I wonder why it is used in other cases too. + } + return; + } + } + while (!all_vcpus_paused()) { qemu_cond_wait(qemu_pause_cond, qemu_global_mutex); penv = first_cpu; -- 1.7.3.4
Re: [Qemu-devel] [PATCH v2 2/8] Allow to use pause_all_vcpus from VCPU context
On 2012-02-11 15:16, Blue Swirl wrote: On Fri, Feb 10, 2012 at 18:31, Jan Kiszka jan.kis...@siemens.com wrote: In order to perform critical manipulations on the VM state in the context of a VCPU, specifically code patching, stopping and resuming of all VCPUs may be necessary. resume_all_vcpus is already compatible, now enable pause_all_vcpus for this use case by stopping the calling context before starting to wait for the whole gang. CC: Paolo Bonzini pbonz...@redhat.com Signed-off-by: Jan Kiszka jan.kis...@siemens.com --- cpus.c | 12 1 files changed, 12 insertions(+), 0 deletions(-) diff --git a/cpus.c b/cpus.c index d0c8340..5adfc6b 100644 --- a/cpus.c +++ b/cpus.c @@ -870,6 +870,18 @@ void pause_all_vcpus(void) penv = (CPUState *)penv-next_cpu; } +if (!qemu_thread_is_self(io_thread)) { +cpu_stop_current(); +if (!kvm_enabled()) { +while (penv) { +penv-stop = 0; +penv-stopped = 1; +penv = (CPUState *)penv-next_cpu; The cast is useless, next_cpu is already CPUState *. I wonder why it is used in other cases too. Indeed, weird. We can clean the others up separately. Jan signature.asc Description: OpenPGP digital signature