From 15a7644956c5265ed3e4d2817a9eca993d0b64fa Mon Sep 17 00:00:00 2001 From: bellard Date: Wed, 23 Nov 2005 21:01:03 +0000 Subject: [PATCH] better SMP scheduling git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1649 c046a42c-6fe2-441c-8c8c-71466251a162 --- vl.c | 42 +++++++++++++++++------------------------- 1 file changed, 17 insertions(+), 25 deletions(-) diff --git a/vl.c b/vl.c index b946390a13..eaf6a1d681 100644 --- a/vl.c +++ b/vl.c @@ -3682,25 +3682,6 @@ void main_loop_wait(int timeout) static CPUState *cur_cpu; -static CPUState *find_next_cpu(void) -{ - CPUState *env; - env = cur_cpu; - for(;;) { - /* get next cpu */ - env = env->next_cpu; - if (!env) - env = first_cpu; - if (!env->cpu_halted) - break; - /* all CPUs are halted ? */ - if (env == cur_cpu) - return NULL; - } - cur_cpu = env; - return env; -} - int main_loop(void) { int ret, timeout; @@ -3709,13 +3690,24 @@ int main_loop(void) cur_cpu = first_cpu; for(;;) { if (vm_running) { - /* find next cpu to run */ - /* XXX: handle HLT correctly */ - env = find_next_cpu(); - if (!env) - ret = EXCP_HLT; - else + + env = cur_cpu; + for(;;) { + /* get next cpu */ + env = env->next_cpu; + if (!env) + env = first_cpu; ret = cpu_exec(env); + if (ret != EXCP_HALTED) + break; + /* all CPUs are halted ? */ + if (env == cur_cpu) { + ret = EXCP_HLT; + break; + } + } + cur_cpu = env; + if (shutdown_requested) { ret = EXCP_INTERRUPT; break;