[4/8] Fix cpu_exit for tcp_cpu_exec

Submitted by Jan Kiszka on June 25, 2010, 2:56 p.m.

Details

Message ID c4f6fe5adec98efecc75518c52dca95bed4ab6db.1277477810.git.jan.kiszka@siemens.com
State New
Headers show

Commit Message

Jan Kiszka June 25, 2010, 2:56 p.m.
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 <jan.kiszka@siemens.com>
---
 cpu-exec.c |    3 +--
 cpus.c     |    3 ++-
 2 files changed, 3 insertions(+), 3 deletions(-)

Patch hide | download patch | download mbox

diff --git a/cpu-exec.c b/cpu-exec.c
index 5f88f3f..d170566 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 37e6b33..ff5e804 100644
--- a/cpus.c
+++ b/cpus.c
@@ -769,7 +769,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,
@@ -788,6 +788,7 @@  bool tcg_cpu_exec(void)
             break;
         }
     }
+    exit_request = 0;
     return tcg_has_work();
 }