From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49784) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bq5P3-0006Zv-EV for qemu-devel@nongnu.org; Fri, 30 Sep 2016 17:31:36 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bq5Oz-0006ab-7o for qemu-devel@nongnu.org; Fri, 30 Sep 2016 17:31:32 -0400 Received: from mail-wm0-x233.google.com ([2a00:1450:400c:c09::233]:36230) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bq5Oz-0006aR-1x for qemu-devel@nongnu.org; Fri, 30 Sep 2016 17:31:29 -0400 Received: by mail-wm0-x233.google.com with SMTP id k125so48664003wma.1 for ; Fri, 30 Sep 2016 14:31:28 -0700 (PDT) From: =?UTF-8?q?Alex=20Benn=C3=A9e?= Date: Fri, 30 Sep 2016 22:31:04 +0100 Message-Id: <20160930213106.20186-14-alex.bennee@linaro.org> In-Reply-To: <20160930213106.20186-1-alex.bennee@linaro.org> References: <20160930213106.20186-1-alex.bennee@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Subject: [Qemu-devel] [PATCH v3 13/15] tcg: ensure cpu_tb_exec/tb_gen_code use atomic_read/write List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org, pbonzini@redhat.com Cc: mttcg@listserver.greensocs.com, fred.konrad@greensocs.com, a.rigo@virtualopensystems.com, cota@braap.org, 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 To meet C11 semantics for shared data access we need to use relaxed atomic accesses. While the completion of data writes w.r.t reads is ensured by QHT's explicit barriers when a newly generated TB is inserted ThreadSanitizer will still complain. By using the relaxed accesses the same code gets generated but instrumentation does not have to worry about a potentially undefined interaction between plain loads/stores. Signed-off-by: Alex Bennée --- cpu-exec.c | 6 +++--- translate-all.c | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/cpu-exec.c b/cpu-exec.c index e114fcd..99c906b 100644 --- a/cpu-exec.c +++ b/cpu-exec.c @@ -140,7 +140,7 @@ static inline tcg_target_ulong cpu_tb_exec(CPUState *cpu, TranslationBlock *itb) uintptr_t ret; TranslationBlock *last_tb; int tb_exit; - uint8_t *tb_ptr = itb->tc_ptr; + uint8_t *tb_ptr = atomic_read(&itb->tc_ptr); qemu_log_mask_and_addr(CPU_LOG_EXEC, itb->pc, "Trace %p [" TARGET_FMT_lx "] %s\n", @@ -291,8 +291,8 @@ static inline TranslationBlock *tb_find(CPUState *cpu, is executed. */ cpu_get_tb_cpu_state(env, &pc, &cs_base, &flags); tb = atomic_rcu_read(&cpu->tb_jmp_cache[tb_jmp_cache_hash_func(pc)]); - if (unlikely(!tb || tb->pc != pc || tb->cs_base != cs_base || - tb->flags != flags)) { + if (unlikely(!tb || atomic_read(&tb->pc) != pc || atomic_read(&tb->cs_base) != cs_base || + atomic_read(&tb->flags) != flags)) { tb = tb_htable_lookup(cpu, pc, cs_base, flags); if (!tb) { diff --git a/translate-all.c b/translate-all.c index 8ca393c..0f13d4d 100644 --- a/translate-all.c +++ b/translate-all.c @@ -1198,10 +1198,10 @@ TranslationBlock *tb_gen_code(CPUState *cpu, } gen_code_buf = tcg_ctx.code_gen_ptr; - tb->tc_ptr = gen_code_buf; - tb->cs_base = cs_base; - tb->flags = flags; - tb->cflags = cflags; + atomic_set(&tb->tc_ptr, gen_code_buf); + atomic_set(&tb->cs_base, cs_base); + atomic_set(&tb->flags, flags); + atomic_set(&tb->cflags, cflags); #ifdef CONFIG_PROFILER tcg_ctx.tb_count1++; /* includes aborted translations because of -- 2.9.3