diff options
author | Jan Kiszka <jan.kiszka@siemens.com> | 2010-06-25 16:56:53 +0200 |
---|---|---|
committer | Aurelien Jarno <aurelien@aurel32.net> | 2010-07-22 05:52:09 +0200 |
commit | 6cabe1f303b9d76458c00f00df7f477449a13b2f (patch) | |
tree | 157c9fcfd0e40b426857f42278d872acee72a97c | |
parent | c629a4bc9725a1ec64c4c89894ef27c758024516 (diff) |
Fix qemu_wait_io_event processing in io-thread mode
When checking for I/O events in the tcg CPU loop, make sure that we
call qemu_wait_io_event_common for all CPUs, not only the current one.
Otherwise pause_all_vcpus may lock up or run_on_cpu requests may starve.
Rename qemu_wait_io_event to qemu_tcg_wait_io_event at this chance and
purge its argument list as it has no use for it.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
-rw-r--r-- | cpus.c | 13 |
1 files changed, 9 insertions, 4 deletions
@@ -403,10 +403,12 @@ static void qemu_wait_io_event_common(CPUState *env) flush_queued_work(env); } -static void qemu_wait_io_event(CPUState *env) +static void qemu_tcg_wait_io_event(void) { + CPUState *env; + while (!tcg_has_work()) - qemu_cond_timedwait(env->halt_cond, &qemu_global_mutex, 1000); + qemu_cond_timedwait(tcg_halt_cond, &qemu_global_mutex, 1000); qemu_mutex_unlock(&qemu_global_mutex); @@ -419,7 +421,10 @@ static void qemu_wait_io_event(CPUState *env) qemu_mutex_unlock(&qemu_fair_mutex); qemu_mutex_lock(&qemu_global_mutex); - qemu_wait_io_event_common(env); + + for (env = first_cpu; env != NULL; env = env->next_cpu) { + qemu_wait_io_event_common(env); + } } static void qemu_kvm_eat_signal(CPUState *env, int timeout) @@ -504,7 +509,7 @@ static void *tcg_cpu_thread_fn(void *arg) while (1) { tcg_cpu_exec(); - qemu_wait_io_event(cur_cpu); + qemu_tcg_wait_io_event(); } return NULL; |