diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2015-08-18 06:34:19 -0700 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2015-09-09 15:34:53 +0200 |
commit | ab096a75cd626dcd4ad34b2a11652df0269bee0d (patch) | |
tree | c4fe850ffe472f0bee61c7c2a792a1d6e026f4a1 | |
parent | b0a46fa796504c7334202877a68c857e49f7c96c (diff) | |
download | hqemu-ab096a75cd626dcd4ad34b2a11652df0269bee0d.zip hqemu-ab096a75cd626dcd4ad34b2a11652df0269bee0d.tar.gz |
tcg: synchronize cpu->exit_request and cpu->tcg_exit_req accesses
Reviewed-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r-- | cpu-exec.c | 6 | ||||
-rw-r--r-- | qom/cpu.c | 2 |
2 files changed, 7 insertions, 1 deletions
@@ -507,8 +507,12 @@ int cpu_exec(CPUState *cpu) * loop. Whatever requested the exit will also * have set something else (eg exit_request or * interrupt_request) which we will handle - * next time around the loop. + * next time around the loop. But we need to + * ensure the tcg_exit_req read in generated code + * comes before the next read of cpu->exit_request + * or cpu->interrupt_request. */ + smp_rmb(); next_tb = 0; break; case TB_EXIT_ICOUNT_EXPIRED: @@ -114,6 +114,8 @@ void cpu_reset_interrupt(CPUState *cpu, int mask) void cpu_exit(CPUState *cpu) { cpu->exit_request = 1; + /* Ensure cpu_exec will see the exit request after TCG has exited. */ + smp_wmb(); cpu->tcg_exit_req = 1; } |