Skip to content

Commit

Permalink
Ensure good ordering of memory instruction in cpu_exec
Browse files Browse the repository at this point in the history
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: Olivier Hainque <hainque@adacore.com>
Signed-off-by: Fabien Chouteau <chouteau@adacore.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Stefan Weil <sw@weilnetz.de>
  • Loading branch information
hainque authored and stweil committed Apr 12, 2013
1 parent ed9164a commit ec9bd89
Showing 1 changed file with 8 additions and 0 deletions.
8 changes: 8 additions & 0 deletions cpu-exec.c
Expand Up @@ -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;
}
Expand Down

0 comments on commit ec9bd89

Please sign in to comment.