From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36410) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bP4qs-0004ud-Vg for qemu-devel@nongnu.org; Mon, 18 Jul 2016 05:28:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bP4qn-0006dQ-4D for qemu-devel@nongnu.org; Mon, 18 Jul 2016 05:28:37 -0400 Received: from mx1.redhat.com ([209.132.183.28]:37355) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bP4qm-0006dH-SY for qemu-devel@nongnu.org; Mon, 18 Jul 2016 05:28:33 -0400 From: Paolo Bonzini Date: Mon, 18 Jul 2016 11:27:50 +0200 Message-Id: <1468834075-25669-19-git-send-email-pbonzini@redhat.com> In-Reply-To: <1468834075-25669-1-git-send-email-pbonzini@redhat.com> References: <1468834075-25669-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PULL 18/23] 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: qemu-devel@nongnu.org Cc: Sergey Fedorov , Sergey Fedorov From: Sergey Fedorov Signed-off-by: Sergey Fedorov Signed-off-by: Sergey Fedorov Reviewed-by: Alex Benn=C3=A9e Message-Id: <20160715175852.30749-11-sergey.fedorov@linaro.org> Signed-off-by: Paolo Bonzini --- cpu-exec.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/cpu-exec.c b/cpu-exec.c index 97e18f7..b1279d2 100644 --- a/cpu-exec.c +++ b/cpu-exec.c @@ -281,7 +281,8 @@ static TranslationBlock *tb_find_physical(CPUState *c= pu, 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; =20 @@ -294,6 +295,7 @@ static TranslationBlock *tb_find_slow(CPUState *cpu, */ mmap_lock(); tb_lock(); + *have_tb_lock =3D true; =20 /* There's a chance that our desired tb has been translated whil= e * taking the locks so we check again inside the lock. @@ -304,7 +306,6 @@ static TranslationBlock *tb_find_slow(CPUState *cpu, tb =3D tb_gen_code(cpu, pc, cs_base, flags, 0); } =20 - tb_unlock(); mmap_unlock(); } =20 @@ -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 =3D false; =20 /* we record a subset of the CPU state. It will always be the same before a given translated block @@ -329,8 +331,8 @@ static inline TranslationBlock *tb_find_fast(CPUState= *cpu, tb =3D atomic_read(&cpu->tb_jmp_cache[tb_jmp_cache_hash_func(pc)]); if (unlikely(!tb || atomic_read(&tb->pc) !=3D pc || atomic_read(&tb->cs_base) !=3D cs_base || - atomic_read(&b->flags) !=3D flags)) { - tb =3D tb_find_slow(cpu, pc, cs_base, flags); + atomic_read(&tb->flags) !=3D flags)) { + tb =3D 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 i= n @@ -343,13 +345,18 @@ static inline TranslationBlock *tb_find_fast(CPUSta= te *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 =3D true; + } /* Check if translation buffer has been flushed */ if (cpu->tb_flushed) { cpu->tb_flushed =3D false; } else if (!tb_is_invalid(tb)) { tb_add_jump(last_tb, tb_exit, tb); } + } + if (have_tb_lock) { tb_unlock(); } return tb; --=20 2.7.4