Commit 6cabe1f3 authored by Jan Kiszka's avatar Jan Kiszka Committed by Aurelien Jarno
Browse files

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: default avatarJan Kiszka <jan.kiszka@siemens.com>
Acked-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Reviewed-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: default avatarAurelien Jarno <aurelien@aurel32.net>
parent c629a4bc
Loading
Loading
Loading
Loading
+9 −4
Original line number Diff line number Diff line
@@ -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,8 +421,11 @@ static void qemu_wait_io_event(CPUState *env)
    qemu_mutex_unlock(&qemu_fair_mutex);

    qemu_mutex_lock(&qemu_global_mutex);

    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;