qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v6 00/25] tcg cross-tb optimizations


From: Richard Henderson
Subject: Re: [Qemu-devel] [PATCH v6 00/25] tcg cross-tb optimizations
Date: Wed, 3 May 2017 09:27:54 -0700
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.0

On 05/03/2017 08:51 AM, Emilio G. Cota wrote:
On Tue, May 02, 2017 at 20:36:52 -0700, Richard Henderson wrote:
On 05/02/2017 12:22 PM, Richard Henderson wrote:
Changes since v5:
...
   * Alpha frontend patch rewritten; the former patch appears to
     drop clock interrupts, not exiting the kernel's idle loop.
     I never *really* figured out why, since both patches seem
     to annotate the same TBs in the same way.

There's definitely something odd going on.

With a rebuild from scratch, the same symptoms have re-appeared for Alpha.
So it really had nothing to do with the original patch.  I'm at a bit of a
loss...

I can reliably reproduce a freeze upon booting.

Oh good. Sort of. The oddly non-reproducible nature of this for me has been disconcerting.

Not sure this can help much (this is the first time I run an Alpha
guest), but here are some findings.

In my testing, if I disable the lookup for JMP/JSR/ret, I can boot OK.
This works:

+++ b/target/alpha/translate.c
@@ -2435,12 +2435,16 @@ static ExitStatus translate_one(DisasContext *ctx, 
uint32_t insn)
          if (ra != 31) {
              tcg_gen_movi_i64(ctx->ir[ra], ctx->pc);
          }
+#if 0
          if (use_exit_tb(ctx)) {
              ret = EXIT_PC_UPDATED;
          } else {
              tcg_gen_lookup_and_goto_ptr(cpu_pc);
              ret = EXIT_GOTO_TB;
          }
+#else
+        ret = EXIT_PC_UPDATED;
+#endif
          break;

However, this doesn't tell us much, since these jumps are pretty common.

Indeed.

Interestingly, if I leave the lookup_and_goto_ptr above (s/#if 0/#if 1/), but
change the lookup_ptr helper to bypass tb_jmp_cache and directly check the
htable, it boots OK.

Now that *is* odd.  However ...

Could it be that we're forgetting to clear (or set) tb_jmp_cache somewhere?

... even that should not affect the setting (or clearing) of cpu->icount_decr.u16.high. Which should have been set by tcg_handle_interrupt. We should have exited the chain of TBs at some point.

Which to me means there's some deeper issue. I.e. the only reason it's been working to date so far is that previously we never put together chains of any great length.


r~



reply via email to

[Prev in Thread] Current Thread [Next in Thread]