From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45641) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bNgI1-0007On-Jt for qemu-devel@nongnu.org; Thu, 14 Jul 2016 09:02:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bNgHv-0001IA-Jb for qemu-devel@nongnu.org; Thu, 14 Jul 2016 09:02:52 -0400 Received: from mail-wm0-x231.google.com ([2a00:1450:400c:c09::231]:37867) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bNgHv-0001I4-9g for qemu-devel@nongnu.org; Thu, 14 Jul 2016 09:02:47 -0400 Received: by mail-wm0-x231.google.com with SMTP id i5so112315659wmg.0 for ; Thu, 14 Jul 2016 06:02:47 -0700 (PDT) References: <1468354426-837-1-git-send-email-sergey.fedorov@linaro.org> <1468354426-837-12-git-send-email-sergey.fedorov@linaro.org> From: Alex =?utf-8?Q?Benn=C3=A9e?= In-reply-to: <1468354426-837-12-git-send-email-sergey.fedorov@linaro.org> Date: Thu, 14 Jul 2016 14:02:43 +0100 Message-ID: <87k2go4bkc.fsf@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Subject: Re: [Qemu-devel] [PATCH v3 11/11] tcg: Merge tb_find_slow() and tb_find_fast() 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 > > These functions are not too big and can be merged together. This makes > locking scheme more clear and easier to follow. > > Signed-off-by: Sergey Fedorov > Signed-off-by: Sergey Fedorov Reviewed-by: Alex Bennée c.f. comments on 10/11. > --- > cpu-exec.c | 72 ++++++++++++++++++++++++++------------------------------------ > 1 file changed, 30 insertions(+), 42 deletions(-) > > diff --git a/cpu-exec.c b/cpu-exec.c > index 22c672fe03fd..6b01e8ceb0e8 100644 > --- a/cpu-exec.c > +++ b/cpu-exec.c > @@ -278,45 +278,9 @@ static TranslationBlock *tb_find_physical(CPUState *cpu, > return qht_lookup(&tcg_ctx.tb_ctx.htable, tb_cmp, &desc, h); > } > > -static TranslationBlock *tb_find_slow(CPUState *cpu, > - target_ulong pc, > - target_ulong cs_base, > - uint32_t flags, > - bool *have_tb_lock) > -{ > - TranslationBlock *tb; > - > - tb = tb_find_physical(cpu, pc, cs_base, flags); > - if (!tb) { > - > - /* 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. > - */ > - 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. > - */ > - tb = tb_find_physical(cpu, pc, cs_base, flags); > - if (!tb) { > - /* if no translated code available, then translate it now */ > - tb = tb_gen_code(cpu, pc, cs_base, flags, 0); > - } > - > - mmap_unlock(); > - } > - > - /* We add the TB in the virtual pc hash table for the fast lookup */ > - atomic_set(&cpu->tb_jmp_cache[tb_jmp_cache_hash_func(pc)], tb); > - return tb; > -} > - > -static inline TranslationBlock *tb_find_fast(CPUState *cpu, > - TranslationBlock *last_tb, > - int tb_exit) > +static inline TranslationBlock *tb_find(CPUState *cpu, > + TranslationBlock *last_tb, > + int tb_exit) > { > CPUArchState *env = (CPUArchState *)cpu->env_ptr; > TranslationBlock *tb; > @@ -331,7 +295,31 @@ 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, &have_tb_lock); > + tb = tb_find_physical(cpu, pc, cs_base, flags); > + if (!tb) { > + > + /* 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. > + */ > + 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. > + */ > + tb = tb_find_physical(cpu, pc, cs_base, flags); > + if (!tb) { > + /* if no translated code available, then translate it now */ > + tb = tb_gen_code(cpu, pc, cs_base, flags, 0); > + } > + > + mmap_unlock(); > + } > + > + /* We add the TB in the virtual pc hash table for the fast lookup */ > + atomic_set(&cpu->tb_jmp_cache[tb_jmp_cache_hash_func(pc)], tb); > } > #ifndef CONFIG_USER_ONLY > /* We don't take care of direct jumps when address mapping changes in > @@ -436,7 +424,7 @@ static inline bool cpu_handle_exception(CPUState *cpu, int *ret) > } else if (replay_has_exception() > && cpu->icount_decr.u16.low + cpu->icount_extra == 0) { > /* try to cause an exception pending in the log */ > - cpu_exec_nocache(cpu, 1, tb_find_fast(cpu, NULL, 0), true); > + cpu_exec_nocache(cpu, 1, tb_find(cpu, NULL, 0), true); > *ret = -1; > return true; > #endif > @@ -620,7 +608,7 @@ int cpu_exec(CPUState *cpu) > atomic_mb_set(&cpu->tb_flushed, false); /* reset before first TB lookup */ > for(;;) { > cpu_handle_interrupt(cpu, &last_tb); > - tb = tb_find_fast(cpu, last_tb, tb_exit); > + tb = tb_find(cpu, last_tb, tb_exit); > cpu_loop_exec_tb(cpu, tb, &last_tb, &tb_exit, &sc); > /* Try to align the host and virtual clocks > if the guest is in advance */ -- Alex Bennée