qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v2] cpu-exec: Do not invalidate original TB in cpu_exec_nocache()
@ 2015-06-30  9:35 Sergey Fedorov
  2015-07-22  6:15 ` Sergey Fedorov
  0 siblings, 1 reply; 3+ messages in thread
From: Sergey Fedorov @ 2015-06-30  9:35 UTC (permalink / raw)
  To: qemu-devel; +Cc: Paolo Bonzini, Pavel Dovgalyuk, Sergey Fedorov

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);
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [Qemu-devel] [PATCH v2] cpu-exec: Do not invalidate original TB in cpu_exec_nocache()
  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
  2015-07-22 11:45   ` Paolo Bonzini
  0 siblings, 1 reply; 3+ messages in thread
From: Sergey Fedorov @ 2015-07-22  6:15 UTC (permalink / raw)
  To: qemu-devel; +Cc: Paolo Bonzini, Pavel Dovgalyuk

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);

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [Qemu-devel] [PATCH v2] cpu-exec: Do not invalidate original TB in cpu_exec_nocache()
  2015-07-22  6:15 ` Sergey Fedorov
@ 2015-07-22 11:45   ` Paolo Bonzini
  0 siblings, 0 replies; 3+ messages in thread
From: Paolo Bonzini @ 2015-07-22 11:45 UTC (permalink / raw)
  To: Sergey Fedorov, qemu-devel; +Cc: Pavel Dovgalyuk



On 22/07/2015 08:15, Sergey Fedorov wrote:
> ping.

Hi, this patch was a bit late for QEMU 2.4, but it will be included in 2.5.

Paolo

> 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

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2015-07-22 11:45 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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
2015-07-22 11:45   ` Paolo Bonzini

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).