From: "Alex Bennée" <alex.bennee@linaro.org>
To: Sergey Fedorov <sergey.fedorov@linaro.org>
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 <crosthwaite.peter@gmail.com>
Subject: Re: [Qemu-devel] [PATCH v3 11/11] tcg: Merge tb_find_slow() and tb_find_fast()
Date: Thu, 14 Jul 2016 14:02:43 +0100 [thread overview]
Message-ID: <87k2go4bkc.fsf@linaro.org> (raw)
In-Reply-To: <1468354426-837-12-git-send-email-sergey.fedorov@linaro.org>
Sergey Fedorov <sergey.fedorov@linaro.org> writes:
> From: Sergey Fedorov <serge.fdrv@gmail.com>
>
> 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 <serge.fdrv@gmail.com>
> Signed-off-by: Sergey Fedorov <sergey.fedorov@linaro.org>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
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
next prev parent reply other threads:[~2016-07-14 13:02 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-12 20:13 [Qemu-devel] [PATCH v3 00/11] Reduce lock contention on TCG hot-path Sergey Fedorov
2016-07-12 20:13 ` [Qemu-devel] [PATCH v3 01/11] util/qht: Document memory ordering assumptions Sergey Fedorov
2016-07-12 23:19 ` Emilio G. Cota
2016-07-13 7:36 ` Paolo Bonzini
2016-07-13 17:50 ` Sergey Fedorov
2016-07-14 13:56 ` Paolo Bonzini
2016-07-14 14:08 ` Sergey Fedorov
2016-07-13 11:13 ` Paolo Bonzini
2016-07-13 18:03 ` Sergey Fedorov
2016-07-14 8:05 ` Paolo Bonzini
2016-07-15 12:37 ` Sergey Fedorov
2016-07-15 12:51 ` Paolo Bonzini
2016-07-15 13:18 ` Sergey Fedorov
2016-07-12 20:13 ` [Qemu-devel] [PATCH v3 02/11] cpu-exec: Pass last_tb by value to tb_find_fast() Sergey Fedorov
2016-07-12 20:13 ` [Qemu-devel] [PATCH v3 03/11] tcg: Prepare safe tb_jmp_cache lookup out of tb_lock Sergey Fedorov
2016-07-14 12:14 ` Alex Bennée
2016-07-12 20:13 ` [Qemu-devel] [PATCH v3 04/11] tcg: Prepare safe access to tb_flushed " Sergey Fedorov
2016-07-14 12:45 ` Alex Bennée
2016-07-14 12:55 ` Sergey Fedorov
2016-07-14 13:12 ` Alex Bennée
2016-07-12 20:13 ` [Qemu-devel] [PATCH v3 05/11] target-i386: Remove redundant HF_SOFTMMU_MASK Sergey Fedorov
2016-07-14 12:19 ` Alex Bennée
2016-07-12 20:13 ` [PATCH v3 06/11] tcg: Introduce tb_mark_invalid() and tb_is_invalid() Sergey Fedorov
2016-07-12 20:13 ` [Qemu-devel] " Sergey Fedorov
2016-07-14 10:25 ` Alex Bennée
2016-07-14 10:25 ` [Qemu-devel] " Alex Bennée
2016-07-14 11:10 ` Sergey Fedorov
2016-07-14 11:10 ` [Qemu-devel] " Sergey Fedorov
2016-07-14 11:48 ` Paolo Bonzini
2016-07-14 11:48 ` [Qemu-devel] " Paolo Bonzini
2016-07-14 12:04 ` Alex Bennée
2016-07-14 12:04 ` [Qemu-devel] " Alex Bennée
2016-07-14 12:53 ` Alex Bennée
2016-07-14 12:53 ` [Qemu-devel] " Alex Bennée
2016-07-14 13:00 ` Sergey Fedorov
2016-07-14 13:00 ` [Qemu-devel] " Sergey Fedorov
2016-07-14 13:12 ` Paolo Bonzini
2016-07-14 13:12 ` [Qemu-devel] " Paolo Bonzini
2016-07-14 13:15 ` Alex Bennée
2016-07-14 13:15 ` [Qemu-devel] " Alex Bennée
2016-07-12 20:13 ` [Qemu-devel] [PATCH v3 07/11] tcg: Prepare TB invalidation for lockless TB lookup Sergey Fedorov
2016-07-14 12:59 ` Alex Bennée
2016-07-14 13:11 ` Sergey Fedorov
2016-07-12 20:13 ` [Qemu-devel] [PATCH v3 08/11] tcg: set up tb->page_addr before insertion Sergey Fedorov
2016-07-12 20:13 ` [Qemu-devel] [PATCH v3 09/11] tcg: cpu-exec: remove tb_lock from the hot-path Sergey Fedorov
2016-07-12 20:13 ` [Qemu-devel] [PATCH v3 10/11] tcg: Avoid bouncing tb_lock between tb_gen_code() and tb_add_jump() Sergey Fedorov
2016-07-14 13:01 ` Alex Bennée
2016-07-14 13:13 ` Sergey Fedorov
2016-07-12 20:13 ` [Qemu-devel] [PATCH v3 11/11] tcg: Merge tb_find_slow() and tb_find_fast() Sergey Fedorov
2016-07-14 13:02 ` Alex Bennée [this message]
2016-07-13 7:39 ` [Qemu-devel] [PATCH v3 00/11] Reduce lock contention on TCG hot-path Paolo Bonzini
2016-07-13 17:00 ` Sergey Fedorov
2016-07-14 9:55 ` Alex Bennée
2016-07-14 11:13 ` Sergey Fedorov
2016-07-13 18:06 ` Sergey Fedorov
2016-07-14 12:02 ` Alex Bennée
2016-07-14 12:10 ` Paolo Bonzini
2016-07-14 13:13 ` Alex Bennée
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87k2go4bkc.fsf@linaro.org \
--to=alex.bennee@linaro.org \
--cc=a.rigo@virtualopensystems.com \
--cc=bobby.prani@gmail.com \
--cc=claudio.fontana@huawei.com \
--cc=cota@braap.org \
--cc=crosthwaite.peter@gmail.com \
--cc=fred.konrad@greensocs.com \
--cc=jan.kiszka@siemens.com \
--cc=mark.burton@greensocs.com \
--cc=mttcg@listserver.greensocs.com \
--cc=patches@linaro.org \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=rth@twiddle.net \
--cc=serge.fdrv@gmail.com \
--cc=sergey.fedorov@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.