From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50900) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bn11U-00083z-Tv for qemu-devel@nongnu.org; Thu, 22 Sep 2016 06:14:33 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bn11P-0006nq-Rf for qemu-devel@nongnu.org; Thu, 22 Sep 2016 06:14:31 -0400 Received: from mail-wm0-f43.google.com ([74.125.82.43]:36699) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bn11P-0006ni-Lw for qemu-devel@nongnu.org; Thu, 22 Sep 2016 06:14:27 -0400 Received: by mail-wm0-f43.google.com with SMTP id w84so243501831wmg.1 for ; Thu, 22 Sep 2016 03:14:27 -0700 (PDT) From: =?UTF-8?q?Alex=20Benn=C3=A9e?= Date: Thu, 22 Sep 2016 11:13:13 +0100 Message-Id: <20160922101316.13064-7-alex.bennee@linaro.org> In-Reply-To: <20160922101316.13064-1-alex.bennee@linaro.org> References: <20160922101316.13064-1-alex.bennee@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Subject: [Qemu-devel] [PATCH v2 6/9] cpu: atomically modify cpu->exit_request List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org, pbonzini@redhat.com, cota@braap.org, stefanha@redhat.com, kwolf@redhat.com Cc: mttcg@listserver.greensocs.com, fred.konrad@greensocs.com, a.rigo@virtualopensystems.com, bobby.prani@gmail.com, nikunj@linux.vnet.ibm.com, mark.burton@greensocs.com, jan.kiszka@siemens.com, serge.fdrv@gmail.com, rth@twiddle.net, peter.maydell@linaro.org, claudio.fontana@huawei.com, =?UTF-8?q?Alex=20Benn=C3=A9e?= , Peter Crosthwaite ThreadSanitizer picks up potential races although we already use barriers to ensure things are in the correct order when processing exit requests. For now we just use the relaxed atomic_set/atomic_read semantics to reassure tsan that we can't tear the value. Signed-off-by: Alex Bennée --- cpu-exec.c | 8 ++++---- qom/cpu.c | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cpu-exec.c b/cpu-exec.c index 9f4bd0b..113d8dc 100644 --- a/cpu-exec.c +++ b/cpu-exec.c @@ -192,7 +192,7 @@ static inline tcg_target_ulong cpu_tb_exec(CPUState *cpu, TranslationBlock *itb) /* We were asked to stop executing TBs (probably a pending * interrupt. We've now stopped, so clear the flag. */ - cpu->tcg_exit_req = 0; + atomic_set(&cpu->tcg_exit_req, 0); } return ret; } @@ -497,8 +497,8 @@ static inline void cpu_handle_interrupt(CPUState *cpu, *last_tb = NULL; } } - if (unlikely(cpu->exit_request || replay_has_interrupt())) { - cpu->exit_request = 0; + if (unlikely(atomic_read(&cpu->exit_request) || replay_has_interrupt())) { + atomic_set(&cpu->exit_request, 0); cpu->exception_index = EXCP_INTERRUPT; cpu_loop_exit(cpu); } @@ -510,7 +510,7 @@ static inline void cpu_loop_exec_tb(CPUState *cpu, TranslationBlock *tb, { uintptr_t ret; - if (unlikely(cpu->exit_request)) { + if (unlikely(atomic_read(&cpu->exit_request))) { return; } diff --git a/qom/cpu.c b/qom/cpu.c index f783b5a..adc8c11 100644 --- a/qom/cpu.c +++ b/qom/cpu.c @@ -119,10 +119,10 @@ void cpu_reset_interrupt(CPUState *cpu, int mask) void cpu_exit(CPUState *cpu) { - cpu->exit_request = 1; + atomic_set(&cpu->exit_request, 1); /* Ensure cpu_exec will see the exit request after TCG has exited. */ smp_wmb(); - cpu->tcg_exit_req = 1; + atomic_set(&cpu->tcg_exit_req, 1); } int cpu_write_elf32_qemunote(WriteCoreDumpFunction f, CPUState *cpu, -- 2.9.3