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

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: 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 f8ca7b43
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -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)
+2 −1
Original line number Diff line number Diff line
@@ -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();
}