From: Igor Mammedov <imammedo@redhat.com>
To: Eduardo Habkost <ehabkost@redhat.com>
Cc: peter.maydell@linaro.org, mark.cave-ayland@ilande.co.uk,
qemu-devel@nongnu.org, blauwirbel@gmail.com, qemu-arm@nongnu.org,
pbonzini@redhat.com, rth@twiddle.net
Subject: Re: [Qemu-arm] [Qemu-devel] [PATCH 08/10] cpu: use CPUClass->parse_features() as convertor to global properties
Date: Thu, 9 Jun 2016 15:40:10 +0200 [thread overview]
Message-ID: <20160609154010.4fbcd652@igors-macbook-pro.local> (raw)
In-Reply-To: <20160609132357.GR18662@thinpad.lan.raisama.net>
On Thu, 9 Jun 2016 10:23:57 -0300
Eduardo Habkost <ehabkost@redhat.com> wrote:
> On Thu, Jun 09, 2016 at 02:38:49PM +0200, Igor Mammedov wrote:
> > On Wed, 8 Jun 2016 13:47:46 -0300
> > Eduardo Habkost <ehabkost@redhat.com> wrote:
> >
> > > On Mon, Jun 06, 2016 at 05:16:50PM +0200, Igor Mammedov wrote:
> > > > Currently CPUClass->parse_features() is used to parse
> > > > -cpu features string and set properties on created CPU
> > > > instances.
> > > >
> > > > But considering that features specified by -cpu apply to
> > > > every created CPU instance, it doesn't make sence to
> > > > parse the same features string for every CPU created.
> > > > It also makes every target that cares about parsing
> > > > features string explicitly call CPUClass->parse_features()
> > > > parser, which gets in a way if we consider using
> > > > generic device_add for CPU hotplug as device_add
> > > > has not a clue about CPU specific hooks.
> > > >
> > > > Turns out we can use global properties mechanism to set
> > > > properties on every created CPU instance for a given
> > > > type. That way it's possible to convert CPU features
> > > > into a set of global properties for CPU type specified
> > > > by -cpu cpu_model and common Device.device_post_init()
> > > > will apply them to CPU of given type automatically
> > > > regardless whether it's manually created CPU or CPU
> > > > created with help of device_add.
> > > >
> > > > Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > > > ---
> > > > This patch only make CPUClass->parse_features()
> > > > a global properties convertor and follow up patches
> > > > will switch individual users to new behaviour
> > >
> > > Considering that we won't fix all callers to not call it multiple
> > > times in the same series, can we add TODO notes to the
> > > ->parse_features() callers that are still need to be fixed?
> > the only callers left that aren't fixed after this series are
> > cpu_init() callers.
> > The rest are taken care of by the last 2 patches.
>
> I just miss some documentation in the patch saying why exactly we
> still need cpu_globals_initialized.
>
> I like to keep the comments consistent in the intermediate steps,
> as in case this patch is considered good for inclusion but the
> other two need a respin for some reason. But if you want to add a
> comment just for cpu_init()/cpu_generic_init(), that's OK.
>
Ok, I'll post v2 for this patch as reply here as 2 following
patches look ok and don't need respining.
> >
> > >
> > > Additional comments (and TODO notes suggestions) below:
> > >
> [...]
> > >
> > > /*TODO: all callers of ->parse_features() need to be changed to
> > > * call it only once, so we can remove this check (or change it
> > > * to assert(!cpu_globals_initialized).
> > > * Current callers of ->parse_features() are:
>
> I guess this needs to be changed to "current callers of
> ->parse_features() that may call it multiple times".
>
> > > * - machvirt_init()
> > > * - cpu_generic_init()
> > > * - cpu_x86_create()
> > > */
> > >
> > > As far as I can see, after applying the whole series, only
> > > cpu_x86_create() will remain.
> > Have you meant cpu_generic_init() ? cpu_x86_create is removed
> > in the last patch.
>
> Oops, yes, I meant cpu_generic_init().
>
> >
> > So I'd drop cpu_x86_create() and machvirt_init() from suggested
> > comment.
>
> Works for me. Although I prefer when patches can be
> reviewed/applied on their own, without depending on the patches
> that come after them.
>
> >
> > >
> > > > + if (cpu_globals_initialized) {
> > > > + return;
> > > > + }
> > > >
> > > > featurestr = features ? strtok(features, ",") : NULL;
> > > >
> > > > while (featurestr) {
> > > > val = strchr(featurestr, '=');
> > > > if (val) {
> > > > + GlobalProperty *prop = g_new0(typeof(*prop), 1);
> > > > *val = 0;
> > > > val++;
> > > > - object_property_parse(OBJECT(cpu), val, featurestr,
> > > > &err);
> > > > - if (err) {
> > > > - error_propagate(errp, err);
> > > > - return;
> > > > - }
> > > > + prop->driver = typename;
> > > > + prop->property = g_strdup(featurestr);
> > > > + prop->value = g_strdup(val);
> > > > + qdev_prop_register_global(prop);
> > > > } else {
> > > > error_setg(errp, "Expected key=value format, found
> > > > %s.", featurestr);
> > > > @@ -308,6 +312,7 @@ static void
> > > > cpu_common_parse_features(CPUState *cpu, char *features, }
> > > > featurestr = strtok(NULL, ",");
> > > > }
> > > > + cpu_globals_initialized = true;
> > >
> > > This will register globals multiple times if called with
> > > "foo=x,bar".
> > I fail to see how it could happen here.
>
> I mean it will register globals multiple times if the function is
> called multiple times. "foo=x" will be registered before the
> error at "bar" is detected and reported.
That's true, however I haven't considered it as a caller of
parse_features() will not call it second time if error occurred.
>
> >
> > > Easier to just set cpu_globals_initialized=true
> > > earlier, and report errors only on the first ->parse_features()
> > > call?
> > Agreed, I'll make it like this:
> >
> > if (cpu_globals_initialized) {
> > return;
> > }
> > cpu_globals_initialized = true;
>
> OK.
>
WARNING: multiple messages have this Message-ID (diff)
From: Igor Mammedov <imammedo@redhat.com>
To: Eduardo Habkost <ehabkost@redhat.com>
Cc: peter.maydell@linaro.org, mark.cave-ayland@ilande.co.uk,
qemu-devel@nongnu.org, blauwirbel@gmail.com, qemu-arm@nongnu.org,
pbonzini@redhat.com, rth@twiddle.net
Subject: Re: [Qemu-devel] [PATCH 08/10] cpu: use CPUClass->parse_features() as convertor to global properties
Date: Thu, 9 Jun 2016 15:40:10 +0200 [thread overview]
Message-ID: <20160609154010.4fbcd652@igors-macbook-pro.local> (raw)
In-Reply-To: <20160609132357.GR18662@thinpad.lan.raisama.net>
On Thu, 9 Jun 2016 10:23:57 -0300
Eduardo Habkost <ehabkost@redhat.com> wrote:
> On Thu, Jun 09, 2016 at 02:38:49PM +0200, Igor Mammedov wrote:
> > On Wed, 8 Jun 2016 13:47:46 -0300
> > Eduardo Habkost <ehabkost@redhat.com> wrote:
> >
> > > On Mon, Jun 06, 2016 at 05:16:50PM +0200, Igor Mammedov wrote:
> > > > Currently CPUClass->parse_features() is used to parse
> > > > -cpu features string and set properties on created CPU
> > > > instances.
> > > >
> > > > But considering that features specified by -cpu apply to
> > > > every created CPU instance, it doesn't make sence to
> > > > parse the same features string for every CPU created.
> > > > It also makes every target that cares about parsing
> > > > features string explicitly call CPUClass->parse_features()
> > > > parser, which gets in a way if we consider using
> > > > generic device_add for CPU hotplug as device_add
> > > > has not a clue about CPU specific hooks.
> > > >
> > > > Turns out we can use global properties mechanism to set
> > > > properties on every created CPU instance for a given
> > > > type. That way it's possible to convert CPU features
> > > > into a set of global properties for CPU type specified
> > > > by -cpu cpu_model and common Device.device_post_init()
> > > > will apply them to CPU of given type automatically
> > > > regardless whether it's manually created CPU or CPU
> > > > created with help of device_add.
> > > >
> > > > Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> > > > ---
> > > > This patch only make CPUClass->parse_features()
> > > > a global properties convertor and follow up patches
> > > > will switch individual users to new behaviour
> > >
> > > Considering that we won't fix all callers to not call it multiple
> > > times in the same series, can we add TODO notes to the
> > > ->parse_features() callers that are still need to be fixed?
> > the only callers left that aren't fixed after this series are
> > cpu_init() callers.
> > The rest are taken care of by the last 2 patches.
>
> I just miss some documentation in the patch saying why exactly we
> still need cpu_globals_initialized.
>
> I like to keep the comments consistent in the intermediate steps,
> as in case this patch is considered good for inclusion but the
> other two need a respin for some reason. But if you want to add a
> comment just for cpu_init()/cpu_generic_init(), that's OK.
>
Ok, I'll post v2 for this patch as reply here as 2 following
patches look ok and don't need respining.
> >
> > >
> > > Additional comments (and TODO notes suggestions) below:
> > >
> [...]
> > >
> > > /*TODO: all callers of ->parse_features() need to be changed to
> > > * call it only once, so we can remove this check (or change it
> > > * to assert(!cpu_globals_initialized).
> > > * Current callers of ->parse_features() are:
>
> I guess this needs to be changed to "current callers of
> ->parse_features() that may call it multiple times".
>
> > > * - machvirt_init()
> > > * - cpu_generic_init()
> > > * - cpu_x86_create()
> > > */
> > >
> > > As far as I can see, after applying the whole series, only
> > > cpu_x86_create() will remain.
> > Have you meant cpu_generic_init() ? cpu_x86_create is removed
> > in the last patch.
>
> Oops, yes, I meant cpu_generic_init().
>
> >
> > So I'd drop cpu_x86_create() and machvirt_init() from suggested
> > comment.
>
> Works for me. Although I prefer when patches can be
> reviewed/applied on their own, without depending on the patches
> that come after them.
>
> >
> > >
> > > > + if (cpu_globals_initialized) {
> > > > + return;
> > > > + }
> > > >
> > > > featurestr = features ? strtok(features, ",") : NULL;
> > > >
> > > > while (featurestr) {
> > > > val = strchr(featurestr, '=');
> > > > if (val) {
> > > > + GlobalProperty *prop = g_new0(typeof(*prop), 1);
> > > > *val = 0;
> > > > val++;
> > > > - object_property_parse(OBJECT(cpu), val, featurestr,
> > > > &err);
> > > > - if (err) {
> > > > - error_propagate(errp, err);
> > > > - return;
> > > > - }
> > > > + prop->driver = typename;
> > > > + prop->property = g_strdup(featurestr);
> > > > + prop->value = g_strdup(val);
> > > > + qdev_prop_register_global(prop);
> > > > } else {
> > > > error_setg(errp, "Expected key=value format, found
> > > > %s.", featurestr);
> > > > @@ -308,6 +312,7 @@ static void
> > > > cpu_common_parse_features(CPUState *cpu, char *features, }
> > > > featurestr = strtok(NULL, ",");
> > > > }
> > > > + cpu_globals_initialized = true;
> > >
> > > This will register globals multiple times if called with
> > > "foo=x,bar".
> > I fail to see how it could happen here.
>
> I mean it will register globals multiple times if the function is
> called multiple times. "foo=x" will be registered before the
> error at "bar" is detected and reported.
That's true, however I haven't considered it as a caller of
parse_features() will not call it second time if error occurred.
>
> >
> > > Easier to just set cpu_globals_initialized=true
> > > earlier, and report errors only on the first ->parse_features()
> > > call?
> > Agreed, I'll make it like this:
> >
> > if (cpu_globals_initialized) {
> > return;
> > }
> > cpu_globals_initialized = true;
>
> OK.
>
next prev parent reply other threads:[~2016-06-09 13:40 UTC|newest]
Thread overview: 79+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-06 15:16 [Qemu-devel] [PATCH 00/10] cpus: make "-cpu cpux, features" global properties Igor Mammedov
2016-06-06 15:16 ` [Qemu-arm] [PATCH 01/10] target-i386: Remove xlevel & hv-spinlocks option fixups Igor Mammedov
2016-06-06 15:16 ` [Qemu-devel] " Igor Mammedov
2016-06-06 15:16 ` [Qemu-arm] [PATCH 02/10] target-i386: cpu: move features logic that requires CPUState to realize time Igor Mammedov
2016-06-06 15:16 ` [Qemu-devel] " Igor Mammedov
2016-06-07 20:25 ` [Qemu-arm] " Eduardo Habkost
2016-06-07 20:25 ` [Qemu-devel] " Eduardo Habkost
2016-06-07 21:07 ` Eric Blake
2016-06-07 22:29 ` [Qemu-arm] " Eduardo Habkost
2016-06-07 22:29 ` Eduardo Habkost
2016-06-06 15:16 ` [Qemu-devel] [PATCH 03/10] target-i386: cpu: move xcc->kvm_required check " Igor Mammedov
2016-06-07 20:23 ` [Qemu-arm] " Eduardo Habkost
2016-06-07 20:23 ` [Qemu-devel] " Eduardo Habkost
2016-06-07 20:28 ` [Qemu-arm] " Eduardo Habkost
2016-06-07 20:28 ` [Qemu-devel] " Eduardo Habkost
2016-06-09 18:34 ` Eduardo Habkost
2016-06-09 18:34 ` Eduardo Habkost
2016-06-10 7:15 ` [Qemu-arm] " Igor Mammedov
2016-06-10 7:15 ` Igor Mammedov
2016-06-10 11:39 ` [Qemu-arm] " Eduardo Habkost
2016-06-10 11:39 ` Eduardo Habkost
2016-06-10 11:48 ` [Qemu-arm] [PATCH] target-i386: Remove assert(kvm_enabled()) from host_x86_cpu_initfn() Eduardo Habkost
2016-06-10 11:48 ` [Qemu-devel] " Eduardo Habkost
2016-06-10 12:40 ` [Qemu-arm] " Igor Mammedov
2016-06-10 12:40 ` [Qemu-devel] " Igor Mammedov
2016-06-06 15:16 ` [Qemu-arm] [PATCH 04/10] target-i386: cpu: use cpu_generic_init() in cpu_x86_init() Igor Mammedov
2016-06-06 15:16 ` [Qemu-devel] " Igor Mammedov
2016-06-07 20:29 ` [Qemu-arm] " Eduardo Habkost
2016-06-07 20:29 ` [Qemu-devel] " Eduardo Habkost
2016-06-06 15:16 ` [Qemu-arm] [PATCH 05/10] target-i386: cpu: consolidate calls of object_property_parse() in x86_cpu_parse_featurestr Igor Mammedov
2016-06-06 15:16 ` [Qemu-devel] " Igor Mammedov
2016-06-07 20:37 ` [Qemu-arm] " Eduardo Habkost
2016-06-07 20:37 ` [Qemu-devel] " Eduardo Habkost
2016-06-06 15:16 ` [Qemu-arm] [PATCH 06/10] target-i386: print obsolete warnings if +-features are used Igor Mammedov
2016-06-06 15:16 ` [Qemu-devel] " Igor Mammedov
2016-06-07 11:44 ` [Qemu-arm] " Paolo Bonzini
2016-06-07 11:44 ` [Qemu-devel] " Paolo Bonzini
2016-06-07 12:32 ` [Qemu-arm] " Igor Mammedov
2016-06-07 12:32 ` [Qemu-devel] " Igor Mammedov
2016-06-07 12:36 ` Paolo Bonzini
2016-06-07 12:36 ` Paolo Bonzini
2016-06-07 12:54 ` Igor Mammedov
2016-06-07 12:54 ` Igor Mammedov
2016-06-07 13:00 ` [Qemu-arm] " Paolo Bonzini
2016-06-07 13:00 ` [Qemu-devel] " Paolo Bonzini
2016-06-07 13:26 ` Igor Mammedov
2016-06-07 13:26 ` Igor Mammedov
2016-06-07 15:17 ` [Qemu-arm] " Eduardo Habkost
2016-06-07 15:17 ` [Qemu-devel] " Eduardo Habkost
2016-06-06 15:16 ` [Qemu-arm] [PATCH 07/10] target-sparc: cpu: use sparc_cpu_parse_features() directly Igor Mammedov
2016-06-06 15:16 ` [Qemu-devel] " Igor Mammedov
2016-06-08 16:30 ` [Qemu-arm] " Eduardo Habkost
2016-06-08 16:30 ` [Qemu-devel] " Eduardo Habkost
2016-06-10 11:51 ` [Qemu-arm] " Eduardo Habkost
2016-06-10 11:51 ` Eduardo Habkost
2016-06-10 18:32 ` [Qemu-arm] " Mark Cave-Ayland
2016-06-10 18:32 ` Mark Cave-Ayland
2016-06-06 15:16 ` [Qemu-devel] [PATCH 08/10] cpu: use CPUClass->parse_features() as convertor to global properties Igor Mammedov
2016-06-08 16:47 ` [Qemu-arm] " Eduardo Habkost
2016-06-08 16:47 ` [Qemu-devel] " Eduardo Habkost
2016-06-09 12:38 ` [Qemu-arm] " Igor Mammedov
2016-06-09 12:38 ` [Qemu-devel] " Igor Mammedov
2016-06-09 13:23 ` [Qemu-arm] " Eduardo Habkost
2016-06-09 13:23 ` [Qemu-devel] " Eduardo Habkost
2016-06-09 13:40 ` Igor Mammedov [this message]
2016-06-09 13:40 ` Igor Mammedov
2016-06-06 15:16 ` [Qemu-arm] [PATCH 09/10] arm: virt: parse cpu_model only once Igor Mammedov
2016-06-06 15:16 ` [Qemu-devel] " Igor Mammedov
2016-06-08 16:55 ` [Qemu-arm] " Eduardo Habkost
2016-06-08 16:55 ` [Qemu-devel] " Eduardo Habkost
2016-06-08 17:25 ` [Qemu-arm] " Peter Maydell
2016-06-08 17:25 ` [Qemu-devel] " Peter Maydell
2016-06-06 15:16 ` [Qemu-devel] [PATCH 10/10] pc: parse cpu features " Igor Mammedov
2016-06-08 17:03 ` [Qemu-arm] " Eduardo Habkost
2016-06-08 17:03 ` [Qemu-devel] " Eduardo Habkost
2016-06-09 12:07 ` [Qemu-arm] " Igor Mammedov
2016-06-09 12:07 ` Igor Mammedov
2016-06-09 13:25 ` [Qemu-arm] " Eduardo Habkost
2016-06-09 13:25 ` Eduardo Habkost
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=20160609154010.4fbcd652@igors-macbook-pro.local \
--to=imammedo@redhat.com \
--cc=blauwirbel@gmail.com \
--cc=ehabkost@redhat.com \
--cc=mark.cave-ayland@ilande.co.uk \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=rth@twiddle.net \
/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.