Commit ec9bd89f authored by Olivier Hainque's avatar Olivier Hainque Committed by Stefan Weil
Browse files

Ensure good ordering of memory instruction in cpu_exec



The IO thread, when it senses cpu_single_env == 0, expects exit_request
to be checked later on. A compiler scheduling constraint is not strong
enough to ensure this on modern architecture. A memory fence is needed
as well.

Signed-off-by: default avatarOlivier Hainque <hainque@adacore.com>
Signed-off-by: default avatarFabien Chouteau <chouteau@adacore.com>
Reviewed-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Signed-off-by: default avatarStefan Weil <sw@weilnetz.de>
parent ed9164a3
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -217,6 +217,14 @@ int cpu_exec(CPUArchState *env)

    cpu_single_env = env;

    /* As long as cpu_single_env is null, up to the assignment just above,
     * requests by other threads to exit the execution loop are expected to
     * be issued using the exit_request global. We must make sure that our
     * evaluation of the global value is performed past the cpu_single_env
     * value transition point, which requires a memory barrier as well as
     * an instruction scheduling constraint on modern architectures.  */
    smp_mb();

    if (unlikely(exit_request)) {
        cpu->exit_request = 1;
    }