From c629a4bc9725a1ec64c4c89894ef27c758024516 Mon Sep 17 00:00:00 2001 From: Jan Kiszka Date: Fri, 25 Jun 2010 16:56:52 +0200 Subject: [PATCH] Fix cpu_exit for tcp_cpu_exec If a cpu_exit request is pending, ensure that we leave the CPU loop quickly. For this purpose, keep the global exit_request pending until we are about to leave tcg_cpu_exec. Also, immediately break out of the SMP loop if the request is set, do not run till the end of the chain. This preserves the VCPU scheduling order in SMP mode. Signed-off-by: Jan Kiszka Acked-by: Paolo Bonzini Reviewed-by: Marcelo Tosatti Signed-off-by: Aurelien Jarno --- cpu-exec.c | 3 +-- cpus.c | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cpu-exec.c b/cpu-exec.c index 5f88f3fa89..d170566cfd 100644 --- a/cpu-exec.c +++ b/cpu-exec.c @@ -237,9 +237,8 @@ int cpu_exec(CPUState *env1) barrier(); env = env1; - if (exit_request) { + if (unlikely(exit_request)) { env->exit_request = 1; - exit_request = 0; } #if defined(TARGET_I386) diff --git a/cpus.c b/cpus.c index b95cc195d0..7533668d2b 100644 --- a/cpus.c +++ b/cpus.c @@ -770,7 +770,7 @@ bool tcg_cpu_exec(void) if (next_cpu == NULL) next_cpu = first_cpu; - for (; next_cpu != NULL; next_cpu = next_cpu->next_cpu) { + for (; next_cpu != NULL && !exit_request; next_cpu = next_cpu->next_cpu) { CPUState *env = cur_cpu = next_cpu; qemu_clock_enable(vm_clock, @@ -789,6 +789,7 @@ bool tcg_cpu_exec(void) break; } } + exit_request = 0; return tcg_has_work(); } -- 2.11.4.GIT