From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36360) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bLRKp-0007A6-Eg for qemu-devel@nongnu.org; Fri, 08 Jul 2016 04:40:32 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bLRKj-0007bB-F8 for qemu-devel@nongnu.org; Fri, 08 Jul 2016 04:40:30 -0400 Received: from mx5-phx2.redhat.com ([209.132.183.37]:52830) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bLRKj-0007az-5d for qemu-devel@nongnu.org; Fri, 08 Jul 2016 04:40:25 -0400 Date: Fri, 8 Jul 2016 04:40:05 -0400 (EDT) From: Paolo Bonzini Message-ID: <71295249.5198305.1467967205882.JavaMail.zimbra@redhat.com> In-Reply-To: <1467909880-18834-4-git-send-email-sergey.fedorov@linaro.org> References: <1467735496-16256-7-git-send-email-alex.bennee@linaro.org> <1467909880-18834-1-git-send-email-sergey.fedorov@linaro.org> <1467909880-18834-4-git-send-email-sergey.fedorov@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 3/3] 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, Alex =?utf-8?Q?Benn=C3=A9e?= , patches@linaro.org, Sergey Fedorov , mttcg@greensocs.com, fred konrad , a rigo , cota@braap.org, bobby prani , rth@twiddle.net, mark burton , jan kiszka , peter maydell , claudio fontana , Peter Crosthwaite > diff --git a/cpu-exec.c b/cpu-exec.c > index dd0bd5007701..54c935039592 100644 > --- a/cpu-exec.c > +++ b/cpu-exec.c > @@ -295,7 +295,8 @@ static TranslationBlock *tb_find_slow(CPUState *cpu, > > /* mmap_lock is needed by tb_gen_code, and mmap_lock must be > * taken outside tb_lock. As system emulation is currently > - * single threaded the locks are NOPs. > + * single threaded the locks are NOPs. Both locks are to be > + * released at the end of tb_find_fast(). > */ Even better: add a "bool *tb_locked" argument to tb_find_slow, and don't move the mmap_lock release. Then tb_find_fast knows directly whether tb_lock is taken, and you don't need any of tb_lock_reset or mmap_lock_reset. Thanks, Paolo > mmap_lock(); > tb_lock(); > @@ -308,9 +309,6 @@ static TranslationBlock *tb_find_slow(CPUState *cpu, > /* if no translated code available, then translate it now */ > tb = tb_gen_code(cpu, pc, cs_base, flags, 0); > } > - > - tb_unlock(); > - mmap_unlock(); > } > > /* We add the TB in the virtual pc hash table for the fast lookup */ > @@ -354,10 +352,15 @@ 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 (!tb_lock_locked()) { > + tb_lock(); > + } > tb_add_jump(*last_tb, tb_exit, tb); > - tb_unlock(); > } > + > + tb_lock_reset(); > + mmap_lock_reset(); > + > return tb; > } > > -- > 1.9.1 > >