From: Eduardo Habkost <ehabkost@redhat.com>
To: Alistair Francis <alistair.francis@xilinx.com>
Cc: Peter Maydell <peter.maydell@linaro.org>,
Thomas Huth <thuth@redhat.com>,
Igor Mitsyanko <i.mitsyanko@gmail.com>,
Richard Henderson <richard.henderson@linaro.org>,
"qemu-devel@nongnu.org Developers" <qemu-devel@nongnu.org>,
"Emilio G. Cota" <cota@braap.org>, qemu-arm <qemu-arm@nongnu.org>,
Marcel Apfelbaum <marcel@redhat.com>,
Igor Mammedov <imammedo@redhat.com>
Subject: Re: [Qemu-arm] [Qemu-devel] [PATCH] hw: add .min_cpus and .default_cpus fields to machine_class
Date: Tue, 7 Nov 2017 10:31:49 -0200 [thread overview]
Message-ID: <20171107123149.GZ3111@localhost.localdomain> (raw)
In-Reply-To: <CAKmqyKO41gHX1Y0+rq8wMygf+ZoZLvOJPzqhfviPsgbDGHecsQ@mail.gmail.com>
On Mon, Nov 06, 2017 at 04:43:34PM -0800, Alistair Francis wrote:
> On Mon, Nov 6, 2017 at 12:13 PM, Emilio G. Cota <cota@braap.org> wrote:
> > On Mon, Nov 06, 2017 at 12:10:22 -0200, Eduardo Habkost wrote:
> >> IMO, initialization state doesn't belong to CPUClass. We already
> >> have a single accelerator object in MachineState::accelerator,
> >> and tcg_initialized could be moved to a AccelState::initialized
> >> field.
> >
> > I don't know how to cleanly get AccelState from a CPUClass pointer
> > (as I said I'm not familiar with object code / qom) -- suggestions
> > welcome! The best I could come up in the limited time I have for
> > this is to use a static bool, as shown below.
I don't believe a TYPE_ACCEL object is created in *-user. We can
consider changing that, but not during 2.11 freeze.
> >
> >
> > ---8<---
> >
> > Subject: [PATCH] qom: move CPUClass.tcg_initialize to a global
> >
> > 55c3cee ("qom: Introduce CPUClass.tcg_initialize", 2017-10-24)
> > introduces a per-CPUClass bool that we check so that the target CPU
> > is initialized for TCG only once. This works well except when
> > we end up creating more than one CPUClass, in which case we end
> > up incorrectly initializing TCG more than once, i.e. once for
> > each CPUClass.
> >
> > This can be replicated with:
> > $ aarch64-softmmu/qemu-system-aarch64 -machine xlnx-zcu102 -smp 6 \
> > -global driver=xlnx,,zynqmp,property=has_rpu,value=on
> > In this case the class name of the "RPUs" is prefixed by "cortex-r5-",
> > whereas the "regular" CPUs are prefixed by "cortex-a53-". This
> > results in two CPUClass instances being created.
> >
> > Fix it by introducing a static variable, so that only the first
> > target CPU being initialized will initialize the target-dependent
> > part of TCG, regardless of CPUClass instances.
> >
> > Fixes: 55c3ceef61fcf06fc98ddc752b7cce788ce7680b
> > Signed-off-by: Emilio G. Cota <cota@braap.org>
>
> This works great for me, is this ok to be applied?
It depends if we are already relying on initialization of CPUs of
different types to be calling two different ->tcg_initialize()
functions. I think that's the case today, so this looks
reasonable as a quick fix for 2.11.
I would wait for an Acked-by from Richard Henderson before
applying it, though. Richard, what do you think?
>
> Thanks,
> Alistair
>
> > ---
> > exec.c | 5 +++--
> > include/qom/cpu.h | 1 -
> > 2 files changed, 3 insertions(+), 3 deletions(-)
> >
> > diff --git a/exec.c b/exec.c
> > index 97a24a8..8b579c0 100644
> > --- a/exec.c
> > +++ b/exec.c
> > @@ -792,11 +792,12 @@ void cpu_exec_initfn(CPUState *cpu)
> > void cpu_exec_realizefn(CPUState *cpu, Error **errp)
> > {
> > CPUClass *cc = CPU_GET_CLASS(cpu);
> > + static bool tcg_target_initialized;
> >
> > cpu_list_add(cpu);
> >
> > - if (tcg_enabled() && !cc->tcg_initialized) {
> > - cc->tcg_initialized = true;
> > + if (tcg_enabled() && !tcg_target_initialized) {
> > + tcg_target_initialized = true;
> > cc->tcg_initialize();
> > }
> >
> > diff --git a/include/qom/cpu.h b/include/qom/cpu.h
> > index fa4b0c9..c2fa151 100644
> > --- a/include/qom/cpu.h
> > +++ b/include/qom/cpu.h
> > @@ -209,7 +209,6 @@ typedef struct CPUClass {
> > /* Keep non-pointer data at the end to minimize holes. */
> > int gdb_num_core_regs;
> > bool gdb_stop_before_watchpoint;
> > - bool tcg_initialized;
> > } CPUClass;
> >
> > #ifdef HOST_WORDS_BIGENDIAN
> > --
> > 2.7.4
> >
> >
--
Eduardo
WARNING: multiple messages have this Message-ID (diff)
From: Eduardo Habkost <ehabkost@redhat.com>
To: Alistair Francis <alistair.francis@xilinx.com>
Cc: "Emilio G. Cota" <cota@braap.org>,
Peter Maydell <peter.maydell@linaro.org>,
Thomas Huth <thuth@redhat.com>,
Igor Mitsyanko <i.mitsyanko@gmail.com>,
Richard Henderson <richard.henderson@linaro.org>,
"qemu-devel@nongnu.org Developers" <qemu-devel@nongnu.org>,
qemu-arm <qemu-arm@nongnu.org>,
Igor Mammedov <imammedo@redhat.com>,
Marcel Apfelbaum <marcel@redhat.com>,
"Edgar E . Iglesias" <edgar.iglesias@gmail.com>
Subject: Re: [Qemu-devel] [PATCH] hw: add .min_cpus and .default_cpus fields to machine_class
Date: Tue, 7 Nov 2017 10:31:49 -0200 [thread overview]
Message-ID: <20171107123149.GZ3111@localhost.localdomain> (raw)
In-Reply-To: <CAKmqyKO41gHX1Y0+rq8wMygf+ZoZLvOJPzqhfviPsgbDGHecsQ@mail.gmail.com>
On Mon, Nov 06, 2017 at 04:43:34PM -0800, Alistair Francis wrote:
> On Mon, Nov 6, 2017 at 12:13 PM, Emilio G. Cota <cota@braap.org> wrote:
> > On Mon, Nov 06, 2017 at 12:10:22 -0200, Eduardo Habkost wrote:
> >> IMO, initialization state doesn't belong to CPUClass. We already
> >> have a single accelerator object in MachineState::accelerator,
> >> and tcg_initialized could be moved to a AccelState::initialized
> >> field.
> >
> > I don't know how to cleanly get AccelState from a CPUClass pointer
> > (as I said I'm not familiar with object code / qom) -- suggestions
> > welcome! The best I could come up in the limited time I have for
> > this is to use a static bool, as shown below.
I don't believe a TYPE_ACCEL object is created in *-user. We can
consider changing that, but not during 2.11 freeze.
> >
> >
> > ---8<---
> >
> > Subject: [PATCH] qom: move CPUClass.tcg_initialize to a global
> >
> > 55c3cee ("qom: Introduce CPUClass.tcg_initialize", 2017-10-24)
> > introduces a per-CPUClass bool that we check so that the target CPU
> > is initialized for TCG only once. This works well except when
> > we end up creating more than one CPUClass, in which case we end
> > up incorrectly initializing TCG more than once, i.e. once for
> > each CPUClass.
> >
> > This can be replicated with:
> > $ aarch64-softmmu/qemu-system-aarch64 -machine xlnx-zcu102 -smp 6 \
> > -global driver=xlnx,,zynqmp,property=has_rpu,value=on
> > In this case the class name of the "RPUs" is prefixed by "cortex-r5-",
> > whereas the "regular" CPUs are prefixed by "cortex-a53-". This
> > results in two CPUClass instances being created.
> >
> > Fix it by introducing a static variable, so that only the first
> > target CPU being initialized will initialize the target-dependent
> > part of TCG, regardless of CPUClass instances.
> >
> > Fixes: 55c3ceef61fcf06fc98ddc752b7cce788ce7680b
> > Signed-off-by: Emilio G. Cota <cota@braap.org>
>
> This works great for me, is this ok to be applied?
It depends if we are already relying on initialization of CPUs of
different types to be calling two different ->tcg_initialize()
functions. I think that's the case today, so this looks
reasonable as a quick fix for 2.11.
I would wait for an Acked-by from Richard Henderson before
applying it, though. Richard, what do you think?
>
> Thanks,
> Alistair
>
> > ---
> > exec.c | 5 +++--
> > include/qom/cpu.h | 1 -
> > 2 files changed, 3 insertions(+), 3 deletions(-)
> >
> > diff --git a/exec.c b/exec.c
> > index 97a24a8..8b579c0 100644
> > --- a/exec.c
> > +++ b/exec.c
> > @@ -792,11 +792,12 @@ void cpu_exec_initfn(CPUState *cpu)
> > void cpu_exec_realizefn(CPUState *cpu, Error **errp)
> > {
> > CPUClass *cc = CPU_GET_CLASS(cpu);
> > + static bool tcg_target_initialized;
> >
> > cpu_list_add(cpu);
> >
> > - if (tcg_enabled() && !cc->tcg_initialized) {
> > - cc->tcg_initialized = true;
> > + if (tcg_enabled() && !tcg_target_initialized) {
> > + tcg_target_initialized = true;
> > cc->tcg_initialize();
> > }
> >
> > diff --git a/include/qom/cpu.h b/include/qom/cpu.h
> > index fa4b0c9..c2fa151 100644
> > --- a/include/qom/cpu.h
> > +++ b/include/qom/cpu.h
> > @@ -209,7 +209,6 @@ typedef struct CPUClass {
> > /* Keep non-pointer data at the end to minimize holes. */
> > int gdb_num_core_regs;
> > bool gdb_stop_before_watchpoint;
> > - bool tcg_initialized;
> > } CPUClass;
> >
> > #ifdef HOST_WORDS_BIGENDIAN
> > --
> > 2.7.4
> >
> >
--
Eduardo
next prev parent reply other threads:[~2017-11-07 12:32 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-11-03 18:47 [Qemu-devel] [PATCH] hw: add .min_cpus and .default_cpus fields to machine_class Emilio G. Cota
2017-11-03 18:47 ` Emilio G. Cota
2017-11-03 18:56 ` [Qemu-arm] " Emilio G. Cota
2017-11-03 18:56 ` [Qemu-devel] " Emilio G. Cota
2017-11-03 20:02 ` [Qemu-arm] " Eduardo Habkost
2017-11-03 20:02 ` [Qemu-devel] " Eduardo Habkost
2017-11-03 22:24 ` [Qemu-arm] " Emilio G. Cota
2017-11-03 22:24 ` [Qemu-devel] " Emilio G. Cota
2017-11-06 14:10 ` [Qemu-arm] " Eduardo Habkost
2017-11-06 14:10 ` [Qemu-devel] " Eduardo Habkost
2017-11-06 20:13 ` [Qemu-arm] " Emilio G. Cota
2017-11-06 20:13 ` [Qemu-devel] " Emilio G. Cota
2017-11-07 0:43 ` [Qemu-arm] " Alistair Francis
2017-11-07 0:43 ` Alistair Francis
2017-11-07 12:31 ` Eduardo Habkost [this message]
2017-11-07 12:31 ` Eduardo Habkost
2017-11-08 21:29 ` [Qemu-arm] " Richard Henderson
2017-11-08 21:29 ` [Qemu-devel] " Richard Henderson
2017-11-08 21:52 ` [Qemu-arm] " Eduardo Habkost
2017-11-08 21:52 ` [Qemu-devel] " Eduardo Habkost
2017-11-08 22:08 ` Alistair Francis
2017-11-08 22:08 ` Alistair Francis
2017-11-06 21:54 ` [Qemu-arm] " Emilio G. Cota
2017-11-06 21:54 ` [Qemu-devel] " Emilio G. Cota
2017-11-06 22:32 ` [Qemu-arm] " Alistair Francis
2017-11-06 22:32 ` Alistair Francis
2017-11-06 23:21 ` [Qemu-arm] " Emilio G. Cota
2017-11-06 23:21 ` Emilio G. Cota
2017-11-06 23:33 ` [Qemu-arm] " Alistair Francis
2017-11-06 23:33 ` Alistair Francis
2017-11-07 0:54 ` [Qemu-arm] " Philippe Mathieu-Daudé
2017-11-07 0:54 ` [Qemu-devel] [Qemu-arm] " Philippe Mathieu-Daudé
2017-11-07 1:19 ` Alistair Francis
2017-11-07 1:19 ` Alistair Francis
2017-11-07 16:15 ` Philippe Mathieu-Daudé
2017-11-07 16:15 ` [Qemu-devel] " Philippe Mathieu-Daudé
2017-11-07 19:32 ` Eduardo Habkost
2017-11-07 19:32 ` [Qemu-devel] " Eduardo Habkost
2017-11-07 19:48 ` [Qemu-arm] " Alistair Francis
2017-11-07 19:48 ` Alistair Francis
2017-11-07 19:54 ` [Qemu-arm] " Eduardo Habkost
2017-11-07 19:54 ` Eduardo Habkost
2017-11-07 20:15 ` [Qemu-arm] " Eduardo Habkost
2017-11-07 20:15 ` Eduardo Habkost
2017-11-10 19:23 ` [Qemu-arm] " Emilio G. Cota
2017-11-10 19:23 ` Emilio G. Cota
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=20171107123149.GZ3111@localhost.localdomain \
--to=ehabkost@redhat.com \
--cc=alistair.francis@xilinx.com \
--cc=cota@braap.org \
--cc=i.mitsyanko@gmail.com \
--cc=imammedo@redhat.com \
--cc=marcel@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
--cc=thuth@redhat.com \
/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.