[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [RFC 6/7] [XXX] tcg: make TCGContext thread-local for s
From: |
Emilio G. Cota |
Subject: |
Re: [Qemu-devel] [RFC 6/7] [XXX] tcg: make TCGContext thread-local for softmmu |
Date: |
Fri, 30 Jun 2017 21:54:17 -0400 |
User-agent: |
Mutt/1.5.24 (2015-08-30) |
On Fri, Jun 30, 2017 at 01:18:58 -0700, Richard Henderson wrote:
> On 06/29/2017 01:28 PM, Emilio G. Cota wrote:
> >This will allow us to generate TCG code in parallel.
> >
> >User-mode is kept out of this: contention due to concurrent translation
> >is more commonly found in full-system mode (e.g. booting a many-core guest).
> >
> >XXX: For now, only convert arm/a64, since these are the only guests that
> >have proper MTTCG support.
>
> Not true. TCG_GUEST_DEFAULT_MO suggests we have 4.
Yes, sorry that was outdated. I'm testing arm/a64 because I can boot
many cores on a64.
> >XXX: This is calling prologue_init once per vCPU, i.e. each TCGContext
> > gets a different prologue/epilogue (all of them with the same
> > contents though). Far from ideal, but for an experiment it
> > "should" work, right?
>
> Um... sure. But surely there's a better way. Perhaps copying the main
> thread's tcg_ctx? That'd be after prologue, and target globals are created.
> That would avoid the need to make all the target cpu_* globals be
> thread-local, for instance.
>
> Of course, now that I think of it, this implies that my tcg patches to use
> pointers instead of indicies is not the Way Forward...
Didn't consider this, but after looking at the code (sans your patchset)
I don't see why this wouldn't work -- would be great to avoid touching
target code, as you point out below.
> > /* Share the TCG temporaries common between 32 and 64 bit modes. */
> >-extern TCGv_env cpu_env;
> >-extern TCGv_i32 cpu_NF, cpu_ZF, cpu_CF, cpu_VF;
> >-extern TCGv_i64 cpu_exclusive_addr;
> >-extern TCGv_i64 cpu_exclusive_val;
> >+extern TCG_THREAD TCGv_env cpu_env;
> >+extern TCG_THREAD TCGv_i32 cpu_NF, cpu_ZF, cpu_CF, cpu_VF;
> >+extern TCG_THREAD TCGv_i64 cpu_exclusive_addr;
> >+extern TCG_THREAD TCGv_i64 cpu_exclusive_val;
>
> It would be Really Good if we could avoid this in the end.
> I see that it's the quickest way to test for now though.
>
> >@@ -887,7 +893,7 @@ typedef struct TCGOpDef {
> > #endif
> > } TCGOpDef;
> >-extern TCGOpDef tcg_op_defs[];
> >+extern TCG_THREAD TCGOpDef tcg_op_defs[];
>
> Why? It's constant after startup.
I was just going for a mass conversion first to see whether this
could ever work. Will refine it.
Thanks,
E.