From: Sergey Fedorov <serge.fdrv@gmail.com>
To: qemu-devel@nongnu.org
Cc: Paolo Bonzini <pbonzini@redhat.com>,
Pavel Dovgalyuk <Pavel.Dovgaluk@ispras.ru>
Subject: Re: [Qemu-devel] [PATCH v2] cpu-exec: Do not invalidate original TB in cpu_exec_nocache()
Date: Wed, 22 Jul 2015 09:15:47 +0300 [thread overview]
Message-ID: <55AF3513.5000208@gmail.com> (raw)
In-Reply-To: <1435656909-29116-1-git-send-email-serge.fdrv@gmail.com>
ping.
On 30.06.2015 12:35, Sergey Fedorov wrote:
> Instead of invalidating an original TB in cpu_exec_nocache()
> prematurely, just save a link to it in the temporary generated TB. If
> cpu_io_recompile() is raised subsequently from the temporary TB,
> invalidate the original one as well. That allows reusing the original TB
> each time cpu_exec_nocache() is called to handle expired instruction
> counter in icount mode.
>
> Signed-off-by: Sergey Fedorov <serge.fdrv@gmail.com>
> ---
>
> v2:
> * take tcg_ctx.tb_ctx.tb_invalidated_flag into account
>
> cpu-exec.c | 8 ++------
> include/exec/exec-all.h | 2 ++
> translate-all.c | 8 ++++++++
> 3 files changed, 12 insertions(+), 6 deletions(-)
>
> diff --git a/cpu-exec.c b/cpu-exec.c
> index 2ffeb6e..f3468e8 100644
> --- a/cpu-exec.c
> +++ b/cpu-exec.c
> @@ -231,19 +231,15 @@ static void cpu_exec_nocache(CPUArchState *env, int max_cycles,
> {
> CPUState *cpu = ENV_GET_CPU(env);
> TranslationBlock *tb;
> - target_ulong pc = orig_tb->pc;
> - target_ulong cs_base = orig_tb->cs_base;
> - uint64_t flags = orig_tb->flags;
>
> /* Should never happen.
> We only end up here when an existing TB is too long. */
> if (max_cycles > CF_COUNT_MASK)
> max_cycles = CF_COUNT_MASK;
>
> - /* tb_gen_code can flush our orig_tb, invalidate it now */
> - tb_phys_invalidate(orig_tb, -1);
> - tb = tb_gen_code(cpu, pc, cs_base, flags,
> + tb = tb_gen_code(cpu, orig_tb->pc, orig_tb->cs_base, orig_tb->flags,
> max_cycles | CF_NOCACHE);
> + tb->orig_tb = tcg_ctx.tb_ctx.tb_invalidated_flag ? NULL : orig_tb;
> cpu->current_tb = tb;
> /* execute the generated code */
> trace_exec_tb_nocache(tb, tb->pc);
> diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h
> index 2573e8c..2aab8c3 100644
> --- a/include/exec/exec-all.h
> +++ b/include/exec/exec-all.h
> @@ -155,6 +155,8 @@ struct TranslationBlock {
> void *tc_ptr; /* pointer to the translated code */
> /* next matching tb for physical address. */
> struct TranslationBlock *phys_hash_next;
> + /* original tb when cflags has CF_NOCACHE */
> + struct TranslationBlock *orig_tb;
> /* first and second physical page containing code. The lower bit
> of the pointer tells the index in page_next[] */
> struct TranslationBlock *page_next[2];
> diff --git a/translate-all.c b/translate-all.c
> index b6b0e1c..5520f93 100644
> --- a/translate-all.c
> +++ b/translate-all.c
> @@ -1532,6 +1532,14 @@ void cpu_io_recompile(CPUState *cpu, uintptr_t retaddr)
> cs_base = tb->cs_base;
> flags = tb->flags;
> tb_phys_invalidate(tb, -1);
> + if (tb->cflags & CF_NOCACHE) {
> + if (tb->orig_tb) {
> + /* Invalidate original TB if this TB was generated in
> + * cpu_exec_nocache() */
> + tb_phys_invalidate(tb->orig_tb, -1);
> + }
> + tb_free(tb);
> + }
> /* FIXME: In theory this could raise an exception. In practice
> we have already translated the block once so it's probably ok. */
> tb_gen_code(cpu, pc, cs_base, flags, cflags);
next prev parent reply other threads:[~2015-07-22 6:15 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-30 9:35 [Qemu-devel] [PATCH v2] cpu-exec: Do not invalidate original TB in cpu_exec_nocache() Sergey Fedorov
2015-07-22 6:15 ` Sergey Fedorov [this message]
2015-07-22 11:45 ` Paolo Bonzini
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=55AF3513.5000208@gmail.com \
--to=serge.fdrv@gmail.com \
--cc=Pavel.Dovgaluk@ispras.ru \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).