Reviewed-by: liguang <lig.f...@cn.fujitsu.com>
在 2013-06-09日的 21:12 +0200,Andreas Färber写道:
> Use new qemu_for_each_cpu() to pause, stop and kick CPUs.
>
> Signed-off-by: Andreas Färber <afaer...@suse.de>
> ---
> cpus.c | 40 ++++++++++++++++++++--------------------
> 1 file changed, 20 insertions(+), 20 deletions(-)
>
> diff --git a/cpus.c b/cpus.c
> index 85b35f6..ad5edfe 100644
> --- a/cpus.c
> +++ b/cpus.c
> @@ -962,39 +962,39 @@ static int all_vcpus_paused(void)
> return 1;
> }
>
> -void pause_all_vcpus(void)
> +static void pause_one_vcpu(CPUState *cpu, void *data)
> {
> - CPUArchState *penv = first_cpu;
> + cpu->stop = true;
> + qemu_cpu_kick(cpu);
> +}
>
> +static void stop_one_vcpu(CPUState *cpu, void *data)
> +{
> + cpu->stop = false;
> + cpu->stopped = true;
> +}
> +
> +static void kick_one_vcpu(CPUState *cpu, void *data)
> +{
> + qemu_cpu_kick(cpu);
> +}
> +
> +void pause_all_vcpus(void)
> +{
> qemu_clock_enable(vm_clock, false);
> - while (penv) {
> - CPUState *pcpu = ENV_GET_CPU(penv);
> - pcpu->stop = true;
> - qemu_cpu_kick(pcpu);
> - penv = penv->next_cpu;
> - }
> + qemu_for_each_cpu(pause_one_vcpu, NULL);
>
> if (qemu_in_vcpu_thread()) {
> cpu_stop_current();
> if (!kvm_enabled()) {
> - penv = first_cpu;
> - while (penv) {
> - CPUState *pcpu = ENV_GET_CPU(penv);
> - pcpu->stop = false;
> - pcpu->stopped = true;
> - penv = penv->next_cpu;
> - }
> + qemu_for_each_cpu(stop_one_vcpu, NULL);
> return;
> }
> }
>
> while (!all_vcpus_paused()) {
> qemu_cond_wait(&qemu_pause_cond, &qemu_global_mutex);
> - penv = first_cpu;
> - while (penv) {
> - qemu_cpu_kick(ENV_GET_CPU(penv));
> - penv = penv->next_cpu;
> - }
> + qemu_for_each_cpu(kick_one_vcpu, NULL);
> }
> }
>