From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45360) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bNgHE-0006Ze-M8 for qemu-devel@nongnu.org; Thu, 14 Jul 2016 09:02:10 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bNgH9-00017W-Mr for qemu-devel@nongnu.org; Thu, 14 Jul 2016 09:02:04 -0400 Received: from mail-wm0-x235.google.com ([2a00:1450:400c:c09::235]:35537) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bNgH9-00017R-Ce for qemu-devel@nongnu.org; Thu, 14 Jul 2016 09:01:59 -0400 Received: by mail-wm0-x235.google.com with SMTP id f65so65727742wmi.0 for ; Thu, 14 Jul 2016 06:01:59 -0700 (PDT) References: <1468354426-837-1-git-send-email-sergey.fedorov@linaro.org> <1468354426-837-11-git-send-email-sergey.fedorov@linaro.org> From: Alex =?utf-8?Q?Benn=C3=A9e?= In-reply-to: <1468354426-837-11-git-send-email-sergey.fedorov@linaro.org> Date: Thu, 14 Jul 2016 14:01:53 +0100 Message-ID: <87lh144blq.fsf@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Subject: Re: [Qemu-devel] [PATCH v3 10/11] tcg: Avoid bouncing tb_lock between tb_gen_code() and tb_add_jump() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Sergey Fedorov Cc: qemu-devel@nongnu.org, mttcg@listserver.greensocs.com, fred.konrad@greensocs.com, a.rigo@virtualopensystems.com, serge.fdrv@gmail.com, cota@braap.org, bobby.prani@gmail.com, rth@twiddle.net, patches@linaro.org, mark.burton@greensocs.com, pbonzini@redhat.com, jan.kiszka@siemens.com, peter.maydell@linaro.org, claudio.fontana@huawei.com, Peter Crosthwaite Sergey Fedorov writes: > From: Sergey Fedorov > > Signed-off-by: Sergey Fedorov > Signed-off-by: Sergey Fedorov Reviewed-by: Alex Bennée Much better than my cack-hander attempt to clean this up ;-) TBH I'd be up for merging this with patch 11 but I'm happy to defer to the maintainers on this one. > --- > cpu-exec.c | 15 +++++++++++---- > 1 file changed, 11 insertions(+), 4 deletions(-) > > diff --git a/cpu-exec.c b/cpu-exec.c > index 4eabd534aba0..22c672fe03fd 100644 > --- a/cpu-exec.c > +++ b/cpu-exec.c > @@ -281,7 +281,8 @@ static TranslationBlock *tb_find_physical(CPUState *cpu, > static TranslationBlock *tb_find_slow(CPUState *cpu, > target_ulong pc, > target_ulong cs_base, > - uint32_t flags) > + uint32_t flags, > + bool *have_tb_lock) > { > TranslationBlock *tb; > > @@ -294,6 +295,7 @@ static TranslationBlock *tb_find_slow(CPUState *cpu, > */ > mmap_lock(); > tb_lock(); > + *have_tb_lock = true; > > /* There's a chance that our desired tb has been translated while > * taking the locks so we check again inside the lock. > @@ -304,7 +306,6 @@ static TranslationBlock *tb_find_slow(CPUState *cpu, > tb = tb_gen_code(cpu, pc, cs_base, flags, 0); > } > > - tb_unlock(); > mmap_unlock(); > } > > @@ -321,6 +322,7 @@ static inline TranslationBlock *tb_find_fast(CPUState *cpu, > TranslationBlock *tb; > target_ulong cs_base, pc; > uint32_t flags; > + bool have_tb_lock = false; > > /* we record a subset of the CPU state. It will > always be the same before a given translated block > @@ -329,7 +331,7 @@ static inline TranslationBlock *tb_find_fast(CPUState *cpu, > tb = atomic_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)) { > - tb = tb_find_slow(cpu, pc, cs_base, flags); > + tb = tb_find_slow(cpu, pc, cs_base, flags, &have_tb_lock); > } > #ifndef CONFIG_USER_ONLY > /* We don't take care of direct jumps when address mapping changes in > @@ -342,13 +344,18 @@ static inline TranslationBlock *tb_find_fast(CPUState *cpu, > #endif > /* See if we can patch the calling TB. */ > if (last_tb && !qemu_loglevel_mask(CPU_LOG_TB_NOCHAIN)) { > - tb_lock(); > + if (!have_tb_lock) { > + tb_lock(); > + have_tb_lock = true; > + } > /* Check if translation buffer has been flushed */ > if (cpu->tb_flushed) { > cpu->tb_flushed = false; > } else if (!tb_is_invalid(tb)) { > tb_add_jump(last_tb, tb_exit, tb); > } > + } > + if (have_tb_lock) { > tb_unlock(); > } > return tb; -- Alex Bennée