From: Markus Armbruster <armbru@redhat.com>
To: Eduardo Habkost <ehabkost@redhat.com>
Cc: qemu-devel@nongnu.org, Peter Maydell <peter.maydell@linaro.org>,
Thomas Huth <thuth@redhat.com>, Like Xu <like.xu@linux.intel.com>,
Riku Voipio <riku.voipio@iki.fi>,
Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>,
Laurent Vivier <laurent@vivier.eu>,
qemu-ppc@nongnu.org, Igor Mammedov <imammedo@redhat.com>,
Paolo Bonzini <pbonzini@redhat.com>,
David Gibson <david@gibson.dropbear.id.au>,
Artyom Tarasenko <atar4qemu@gmail.com>,
Richard Henderson <rth@twiddle.net>
Subject: Re: [Qemu-devel] [PATCH 5/5] cpu: Add MachineState parameter to parse_features()
Date: Wed, 17 Apr 2019 07:45:01 +0200 [thread overview]
Message-ID: <87wojtyyle.fsf@dusky.pond.sub.org> (raw)
In-Reply-To: <20190417025944.16154-6-ehabkost@redhat.com> (Eduardo Habkost's message of "Tue, 16 Apr 2019 23:59:44 -0300")
Eduardo Habkost <ehabkost@redhat.com> writes:
> The ppc implementation of parse_features() requires the machine
> object to be created before it gets called. This is far from
> obvious when reading the code at main().
>
> Instead of making it call qdev_get_machine(), require the caller
> of parse_cpu_option() to provide the machine object.
>
> This makes the initialization dependency explicit at main(), and
> will let us move qdev_get_machine() to CONFIG_SOFTMMU in the
> future.
>
> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
> ---
> include/qom/cpu.h | 5 +++--
> target/ppc/cpu-qom.h | 3 ++-
> exec.c | 4 ++--
> qom/cpu.c | 3 ++-
> target/i386/cpu.c | 3 ++-
> target/ppc/translate_init.inc.c | 7 ++++---
> target/sparc/cpu.c | 3 ++-
> vl.c | 3 ++-
> 8 files changed, 19 insertions(+), 12 deletions(-)
>
> diff --git a/include/qom/cpu.h b/include/qom/cpu.h
> index e11b14d9ac..cbc8e103bb 100644
> --- a/include/qom/cpu.h
> +++ b/include/qom/cpu.h
> @@ -164,7 +164,8 @@ typedef struct CPUClass {
> /*< public >*/
>
> ObjectClass *(*class_by_name)(const char *cpu_model);
> - void (*parse_features)(const char *typename, char *str, Error **errp);
> + void (*parse_features)(MachineState *machine, const char *typename,
> + char *str, Error **errp);
>
> void (*reset)(CPUState *cpu);
> int reset_dump_flags;
> @@ -697,7 +698,7 @@ CPUState *cpu_create(const char *typename);
> * Returns: type of CPU to create or prints error and terminates process
> * if an error occurred.
> */
> -const char *parse_cpu_option(const char *cpu_option);
> +const char *parse_cpu_option(MachineState *machine, const char *cpu_option);
>
> /**
> * lookup_cpu_class:
> diff --git a/target/ppc/cpu-qom.h b/target/ppc/cpu-qom.h
> index be9b4c30c3..7891465554 100644
> --- a/target/ppc/cpu-qom.h
> +++ b/target/ppc/cpu-qom.h
> @@ -167,7 +167,8 @@ typedef struct PowerPCCPUClass {
> DeviceRealize parent_realize;
> DeviceUnrealize parent_unrealize;
> void (*parent_reset)(CPUState *cpu);
> - void (*parent_parse_features)(const char *type, char *str, Error **errp);
> + void (*parent_parse_features)(MachineState *machine, const char *type,
> + char *str, Error **errp);
>
> uint32_t pvr;
> bool (*pvr_match)(struct PowerPCCPUClass *pcc, uint32_t pvr);
> diff --git a/exec.c b/exec.c
> index d359e709a6..1ca95df9d8 100644
> --- a/exec.c
> +++ b/exec.c
> @@ -992,7 +992,7 @@ CPUClass *lookup_cpu_class(const char *cpu_model, Error **errp)
> return CPU_CLASS(oc);
> }
>
> -const char *parse_cpu_option(const char *cpu_option)
> +const char *parse_cpu_option(MachineState *machine, const char *cpu_option)
> {
> CPUClass *cc;
> gchar **model_pieces;
> @@ -1002,7 +1002,7 @@ const char *parse_cpu_option(const char *cpu_option)
>
> cc = lookup_cpu_class(model_pieces[0], &error_fatal);
> cpu_type = object_class_get_name(OBJECT_CLASS(cc));
> - cc->parse_features(cpu_type, model_pieces[1], &error_fatal);
> + cc->parse_features(machine, cpu_type, model_pieces[1], &error_fatal);
> g_strfreev(model_pieces);
> return cpu_type;
> }
> diff --git a/qom/cpu.c b/qom/cpu.c
> index a8d2958956..c8a7b56148 100644
> --- a/qom/cpu.c
> +++ b/qom/cpu.c
> @@ -291,7 +291,8 @@ ObjectClass *cpu_class_by_name(const char *typename, const char *cpu_model)
> return cc->class_by_name(cpu_model);
> }
>
> -static void cpu_common_parse_features(const char *typename, char *features,
> +static void cpu_common_parse_features(MachineState *machine,
> + const char *typename, char *features,
> Error **errp)
> {
> char *val;
> diff --git a/target/i386/cpu.c b/target/i386/cpu.c
> index d6bb57d210..f5e15ac5da 100644
> --- a/target/i386/cpu.c
> +++ b/target/i386/cpu.c
> @@ -3528,7 +3528,8 @@ static gint compare_string(gconstpointer a, gconstpointer b)
>
> /* Parse "+feature,-feature,feature=foo" CPU feature string
> */
> -static void x86_cpu_parse_featurestr(const char *typename, char *features,
> +static void x86_cpu_parse_featurestr(MachineState *machine,
> + const char *typename, char *features,
> Error **errp)
> {
> char *featurestr; /* Single 'key=value" string being parsed */
> diff --git a/target/ppc/translate_init.inc.c b/target/ppc/translate_init.inc.c
> index 0bd555eb19..2ad223fcca 100644
> --- a/target/ppc/translate_init.inc.c
> +++ b/target/ppc/translate_init.inc.c
> @@ -10119,10 +10119,11 @@ static ObjectClass *ppc_cpu_class_by_name(const char *name)
> return oc;
> }
>
> -static void ppc_cpu_parse_featurestr(const char *type, char *features,
> +static void ppc_cpu_parse_featurestr(MachineState *ms,
> + const char *type, char *features,
> Error **errp)
> {
> - Object *machine = qdev_get_machine();
> + Object *machine = OBJECT(ms);
> const PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(object_class_by_name(type));
>
> if (!features) {
> @@ -10171,7 +10172,7 @@ static void ppc_cpu_parse_featurestr(const char *type, char *features,
> }
>
> /* do property processing with generic handler */
> - pcc->parent_parse_features(type, features, errp);
> + pcc->parent_parse_features(ms, type, features, errp);
> }
>
> PowerPCCPUClass *ppc_cpu_get_family_class(PowerPCCPUClass *pcc)
> diff --git a/target/sparc/cpu.c b/target/sparc/cpu.c
> index 4a4445bdf5..7e360de5ee 100644
> --- a/target/sparc/cpu.c
> +++ b/target/sparc/cpu.c
> @@ -115,7 +115,8 @@ cpu_add_feat_as_prop(const char *typename, const char *name, const char *val)
> }
>
> /* Parse "+feature,-feature,feature=foo" CPU feature string */
> -static void sparc_cpu_parse_features(const char *typename, char *features,
> +static void sparc_cpu_parse_features(MachineState *machine,
> + const char *typename, char *features,
> Error **errp)
> {
> GList *l, *plus_features = NULL, *minus_features = NULL;
> diff --git a/vl.c b/vl.c
> index c57e28d1da..e78c4d5a53 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -4466,7 +4466,8 @@ int main(int argc, char **argv, char **envp)
> /* parse features once if machine provides default cpu_type */
> current_machine->cpu_type = machine_class->default_cpu_type;
> if (cpu_option) {
> - current_machine->cpu_type = parse_cpu_option(cpu_option);
> + current_machine->cpu_type =
> + parse_cpu_option(current_machine, cpu_option);
> }
> parse_numa_opts(current_machine);
Well, it's not quite as bad as the commit message made me expect: since
we assign to current_machine->cpu_type, we already have a dependence on
machine creation.
Regardless, replacing qdev_get_machine() by explicit data flow is an
improvement. More so if it really lets us confine qdev_get_machine() to
CONFIG_SOFTMMU.
WARNING: multiple messages have this Message-ID (diff)
From: Markus Armbruster <armbru@redhat.com>
To: Eduardo Habkost <ehabkost@redhat.com>
Cc: Peter Maydell <peter.maydell@linaro.org>,
Thomas Huth <thuth@redhat.com>, Like Xu <like.xu@linux.intel.com>,
Riku Voipio <riku.voipio@iki.fi>,
Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>,
qemu-devel@nongnu.org, Laurent Vivier <laurent@vivier.eu>,
qemu-ppc@nongnu.org, Paolo Bonzini <pbonzini@redhat.com>,
Igor Mammedov <imammedo@redhat.com>,
Richard Henderson <rth@twiddle.net>,
Artyom Tarasenko <atar4qemu@gmail.com>,
David Gibson <david@gibson.dropbear.id.au>
Subject: Re: [Qemu-devel] [PATCH 5/5] cpu: Add MachineState parameter to parse_features()
Date: Wed, 17 Apr 2019 07:45:01 +0200 [thread overview]
Message-ID: <87wojtyyle.fsf@dusky.pond.sub.org> (raw)
Message-ID: <20190417054501.bzpnsKh370IcfV5RZMYZUzdXp_87l-AUGtJG0ofUXs4@z> (raw)
In-Reply-To: <20190417025944.16154-6-ehabkost@redhat.com> (Eduardo Habkost's message of "Tue, 16 Apr 2019 23:59:44 -0300")
Eduardo Habkost <ehabkost@redhat.com> writes:
> The ppc implementation of parse_features() requires the machine
> object to be created before it gets called. This is far from
> obvious when reading the code at main().
>
> Instead of making it call qdev_get_machine(), require the caller
> of parse_cpu_option() to provide the machine object.
>
> This makes the initialization dependency explicit at main(), and
> will let us move qdev_get_machine() to CONFIG_SOFTMMU in the
> future.
>
> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
> ---
> include/qom/cpu.h | 5 +++--
> target/ppc/cpu-qom.h | 3 ++-
> exec.c | 4 ++--
> qom/cpu.c | 3 ++-
> target/i386/cpu.c | 3 ++-
> target/ppc/translate_init.inc.c | 7 ++++---
> target/sparc/cpu.c | 3 ++-
> vl.c | 3 ++-
> 8 files changed, 19 insertions(+), 12 deletions(-)
>
> diff --git a/include/qom/cpu.h b/include/qom/cpu.h
> index e11b14d9ac..cbc8e103bb 100644
> --- a/include/qom/cpu.h
> +++ b/include/qom/cpu.h
> @@ -164,7 +164,8 @@ typedef struct CPUClass {
> /*< public >*/
>
> ObjectClass *(*class_by_name)(const char *cpu_model);
> - void (*parse_features)(const char *typename, char *str, Error **errp);
> + void (*parse_features)(MachineState *machine, const char *typename,
> + char *str, Error **errp);
>
> void (*reset)(CPUState *cpu);
> int reset_dump_flags;
> @@ -697,7 +698,7 @@ CPUState *cpu_create(const char *typename);
> * Returns: type of CPU to create or prints error and terminates process
> * if an error occurred.
> */
> -const char *parse_cpu_option(const char *cpu_option);
> +const char *parse_cpu_option(MachineState *machine, const char *cpu_option);
>
> /**
> * lookup_cpu_class:
> diff --git a/target/ppc/cpu-qom.h b/target/ppc/cpu-qom.h
> index be9b4c30c3..7891465554 100644
> --- a/target/ppc/cpu-qom.h
> +++ b/target/ppc/cpu-qom.h
> @@ -167,7 +167,8 @@ typedef struct PowerPCCPUClass {
> DeviceRealize parent_realize;
> DeviceUnrealize parent_unrealize;
> void (*parent_reset)(CPUState *cpu);
> - void (*parent_parse_features)(const char *type, char *str, Error **errp);
> + void (*parent_parse_features)(MachineState *machine, const char *type,
> + char *str, Error **errp);
>
> uint32_t pvr;
> bool (*pvr_match)(struct PowerPCCPUClass *pcc, uint32_t pvr);
> diff --git a/exec.c b/exec.c
> index d359e709a6..1ca95df9d8 100644
> --- a/exec.c
> +++ b/exec.c
> @@ -992,7 +992,7 @@ CPUClass *lookup_cpu_class(const char *cpu_model, Error **errp)
> return CPU_CLASS(oc);
> }
>
> -const char *parse_cpu_option(const char *cpu_option)
> +const char *parse_cpu_option(MachineState *machine, const char *cpu_option)
> {
> CPUClass *cc;
> gchar **model_pieces;
> @@ -1002,7 +1002,7 @@ const char *parse_cpu_option(const char *cpu_option)
>
> cc = lookup_cpu_class(model_pieces[0], &error_fatal);
> cpu_type = object_class_get_name(OBJECT_CLASS(cc));
> - cc->parse_features(cpu_type, model_pieces[1], &error_fatal);
> + cc->parse_features(machine, cpu_type, model_pieces[1], &error_fatal);
> g_strfreev(model_pieces);
> return cpu_type;
> }
> diff --git a/qom/cpu.c b/qom/cpu.c
> index a8d2958956..c8a7b56148 100644
> --- a/qom/cpu.c
> +++ b/qom/cpu.c
> @@ -291,7 +291,8 @@ ObjectClass *cpu_class_by_name(const char *typename, const char *cpu_model)
> return cc->class_by_name(cpu_model);
> }
>
> -static void cpu_common_parse_features(const char *typename, char *features,
> +static void cpu_common_parse_features(MachineState *machine,
> + const char *typename, char *features,
> Error **errp)
> {
> char *val;
> diff --git a/target/i386/cpu.c b/target/i386/cpu.c
> index d6bb57d210..f5e15ac5da 100644
> --- a/target/i386/cpu.c
> +++ b/target/i386/cpu.c
> @@ -3528,7 +3528,8 @@ static gint compare_string(gconstpointer a, gconstpointer b)
>
> /* Parse "+feature,-feature,feature=foo" CPU feature string
> */
> -static void x86_cpu_parse_featurestr(const char *typename, char *features,
> +static void x86_cpu_parse_featurestr(MachineState *machine,
> + const char *typename, char *features,
> Error **errp)
> {
> char *featurestr; /* Single 'key=value" string being parsed */
> diff --git a/target/ppc/translate_init.inc.c b/target/ppc/translate_init.inc.c
> index 0bd555eb19..2ad223fcca 100644
> --- a/target/ppc/translate_init.inc.c
> +++ b/target/ppc/translate_init.inc.c
> @@ -10119,10 +10119,11 @@ static ObjectClass *ppc_cpu_class_by_name(const char *name)
> return oc;
> }
>
> -static void ppc_cpu_parse_featurestr(const char *type, char *features,
> +static void ppc_cpu_parse_featurestr(MachineState *ms,
> + const char *type, char *features,
> Error **errp)
> {
> - Object *machine = qdev_get_machine();
> + Object *machine = OBJECT(ms);
> const PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(object_class_by_name(type));
>
> if (!features) {
> @@ -10171,7 +10172,7 @@ static void ppc_cpu_parse_featurestr(const char *type, char *features,
> }
>
> /* do property processing with generic handler */
> - pcc->parent_parse_features(type, features, errp);
> + pcc->parent_parse_features(ms, type, features, errp);
> }
>
> PowerPCCPUClass *ppc_cpu_get_family_class(PowerPCCPUClass *pcc)
> diff --git a/target/sparc/cpu.c b/target/sparc/cpu.c
> index 4a4445bdf5..7e360de5ee 100644
> --- a/target/sparc/cpu.c
> +++ b/target/sparc/cpu.c
> @@ -115,7 +115,8 @@ cpu_add_feat_as_prop(const char *typename, const char *name, const char *val)
> }
>
> /* Parse "+feature,-feature,feature=foo" CPU feature string */
> -static void sparc_cpu_parse_features(const char *typename, char *features,
> +static void sparc_cpu_parse_features(MachineState *machine,
> + const char *typename, char *features,
> Error **errp)
> {
> GList *l, *plus_features = NULL, *minus_features = NULL;
> diff --git a/vl.c b/vl.c
> index c57e28d1da..e78c4d5a53 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -4466,7 +4466,8 @@ int main(int argc, char **argv, char **envp)
> /* parse features once if machine provides default cpu_type */
> current_machine->cpu_type = machine_class->default_cpu_type;
> if (cpu_option) {
> - current_machine->cpu_type = parse_cpu_option(cpu_option);
> + current_machine->cpu_type =
> + parse_cpu_option(current_machine, cpu_option);
> }
> parse_numa_opts(current_machine);
Well, it's not quite as bad as the commit message made me expect: since
we assign to current_machine->cpu_type, we already have a dependence on
machine creation.
Regardless, replacing qdev_get_machine() by explicit data flow is an
improvement. More so if it really lets us confine qdev_get_machine() to
CONFIG_SOFTMMU.
next prev parent reply other threads:[~2019-04-17 5:45 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-17 2:59 [Qemu-devel] [PATCH 0/5] Remove qdev_get_machine() call from ppc_cpu_parse_featurestr() Eduardo Habkost
2019-04-17 2:59 ` Eduardo Habkost
2019-04-17 2:59 ` [Qemu-devel] [PATCH 1/5] cpu: Rename parse_cpu_model() to parse_cpu_option() Eduardo Habkost
2019-04-17 2:59 ` Eduardo Habkost
2019-04-17 5:21 ` David Gibson
2019-04-17 5:21 ` David Gibson
2019-04-18 11:07 ` Igor Mammedov
2019-04-18 11:07 ` Igor Mammedov
2019-04-17 2:59 ` [Qemu-devel] [PATCH 2/5] cpu: Extract CPU class lookup from parse_cpu_option() Eduardo Habkost
2019-04-17 2:59 ` Eduardo Habkost
2019-04-17 5:22 ` David Gibson
2019-04-17 5:22 ` David Gibson
2019-04-17 5:41 ` Markus Armbruster
2019-04-17 5:41 ` Markus Armbruster
2019-04-17 13:55 ` Eduardo Habkost
2019-04-17 13:55 ` Eduardo Habkost
2019-04-17 2:59 ` [Qemu-devel] [PATCH 3/5] linux-user: Use lookup_cpu_class() Eduardo Habkost
2019-04-17 2:59 ` Eduardo Habkost
2019-04-17 5:23 ` David Gibson
2019-04-17 5:23 ` David Gibson
2019-04-18 4:52 ` Eduardo Habkost
2019-04-18 4:52 ` Eduardo Habkost
2019-04-17 2:59 ` [Qemu-devel] [PATCH 4/5] bsd-user: " Eduardo Habkost
2019-04-17 2:59 ` Eduardo Habkost
2019-04-17 5:23 ` David Gibson
2019-04-17 5:23 ` David Gibson
2019-04-17 2:59 ` [Qemu-devel] [PATCH 5/5] cpu: Add MachineState parameter to parse_features() Eduardo Habkost
2019-04-17 2:59 ` Eduardo Habkost
2019-04-17 5:25 ` David Gibson
2019-04-17 5:25 ` David Gibson
2019-04-17 5:45 ` Markus Armbruster [this message]
2019-04-17 5:45 ` Markus Armbruster
2019-04-17 5:45 ` [Qemu-devel] [PATCH 0/5] Remove qdev_get_machine() call from ppc_cpu_parse_featurestr() Markus Armbruster
2019-04-17 5:45 ` Markus Armbruster
2019-04-18 3:35 ` Eduardo Habkost
2019-04-18 3:35 ` 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=87wojtyyle.fsf@dusky.pond.sub.org \
--to=armbru@redhat.com \
--cc=atar4qemu@gmail.com \
--cc=david@gibson.dropbear.id.au \
--cc=ehabkost@redhat.com \
--cc=imammedo@redhat.com \
--cc=laurent@vivier.eu \
--cc=like.xu@linux.intel.com \
--cc=mark.cave-ayland@ilande.co.uk \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=riku.voipio@iki.fi \
--cc=rth@twiddle.net \
--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.