From: Paolo Bonzini <pbonzini@redhat.com>
To: Eduardo Habkost <ehabkost@redhat.com>
Cc: Igor Mammedov <imammedo@redhat.com>,
qemu-devel@nongnu.org, peter maydell <peter.maydell@linaro.org>,
mark cave-ayland <mark.cave-ayland@ilande.co.uk>,
blauwirbel@gmail.com, qemu-arm@nongnu.org, rth@twiddle.net,
Markus Armbruster <armbru@redhat.com>
Subject: Re: [Qemu-devel] Handling errors caused by -global (was Re: [PATCH v2 4/6] cpu: use CPUClass->parse_features() as convertor to global properties)
Date: Tue, 14 Jun 2016 17:41:03 -0400 (EDT) [thread overview]
Message-ID: <1646409152.22421731.1465940463160.JavaMail.zimbra@redhat.com> (raw)
In-Reply-To: <20160614194718.GJ17952@thinpad.lan.raisama.net>
----- Original Message -----
> From: "Eduardo Habkost" <ehabkost@redhat.com>
> To: "Igor Mammedov" <imammedo@redhat.com>
> Cc: qemu-devel@nongnu.org, "peter maydell" <peter.maydell@linaro.org>, "mark cave-ayland"
> <mark.cave-ayland@ilande.co.uk>, blauwirbel@gmail.com, qemu-arm@nongnu.org, pbonzini@redhat.com, rth@twiddle.net,
> "Markus Armbruster" <armbru@redhat.com>
> Sent: Tuesday, June 14, 2016 9:47:18 PM
> Subject: Handling errors caused by -global (was Re: [Qemu-devel] [PATCH v2 4/6] cpu: use CPUClass->parse_features()
> as convertor to global properties)
>
> On Thu, Jun 09, 2016 at 07:11:01PM +0200, Igor Mammedov wrote:
> [...]
> > -static void cpu_common_parse_features(CPUState *cpu, char *features,
> > +static void cpu_common_parse_features(const char *typename, char
> > *features,
> > Error **errp)
> > {
> > char *featurestr; /* Single "key=value" string being parsed */
> > char *val;
> > - Error *err = NULL;
> > + static bool cpu_globals_initialized;
> > +
> > + /* 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:
> > + * - machvirt_init()
> > + * - cpu_generic_init()
> > + * - cpu_x86_create()
> > + */
> > + if (cpu_globals_initialized) {
> > + return;
> > + }
> > + cpu_globals_initialized = true;
> >
> > 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);
>
> This allows the user to trigger an assert:
>
> $ ./x86_64-softmmu/qemu-system-x86_64 -cpu qemu64,INVALID=on
> qemu-system-x86_64: hw/core/qdev-properties.c:1087:
> qdev_prop_set_globals_for_type: Assertion `prop->user_provided' failed.
> Aborted (core dumped)
>
> but even if we fix the assert by setting
> prop->user_provided=true, we have a problem. Previous behavior
> was:
>
> $ ./x86_64-softmmu/qemu-system-x86_64 -cpu qemu64,INVALID=on
> qemu-system-x86_64: Property '.INVALID' not found
> $
>
> after this patch, and setting prop->user_provided=true, we have:
>
> $ ./x86_64-softmmu/qemu-system-x86_64 -cpu qemu64,INVALID=on
> qemu-system-x86_64: Warning: global qemu64-x86_64-cpu.INVALID=on ignored:
> Property '.INVALID' not found
> [QEMU keeps running]
>
> QEMU needs to refuse to run if an invalid property is specified
> on -cpu. It is an important mechanism to prevent VMs from running
> if the user is requesting for a unsupported feature that requires
> newer QEMU.
>
> Any suggestions on how to fix that?
Replace user_provided with a Error* argument to qdev_prop_register_global.
It can be &error_abort and NULL for the current users of the function,
while -cpu can use &error_fatal.
Paolo
> Maybe qdev_prop_set_globals() can collect errors in a list in
> DeviceState, and we can check for them in code that creates
> device objects (like cpu_generic_init(), qdev_device_add()), or
> in the beginning of device_set_realized().
>
> --
> Eduardo
>
next prev parent reply other threads:[~2016-06-14 21:41 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-09 17:10 [Qemu-devel] [PATCH v2 0/6] cpus: make "-cpu cpux, features" global properties Igor Mammedov
2016-06-09 17:10 ` [Qemu-devel] [PATCH v2 1/6] target-i386: cpu: consolidate calls of object_property_parse() in x86_cpu_parse_featurestr Igor Mammedov
2016-06-09 17:29 ` Eduardo Habkost
2016-06-09 19:39 ` Eric Blake
2016-06-09 19:50 ` Eduardo Habkost
2016-06-10 7:23 ` Igor Mammedov
2016-06-10 7:24 ` Igor Mammedov
2016-06-09 17:10 ` [Qemu-devel] [PATCH v2 2/6] target-i386: print obsolete warnings if +-features are used Igor Mammedov
2016-06-09 20:22 ` Eduardo Habkost
2016-06-09 17:11 ` [Qemu-devel] [PATCH v2 3/6] target-sparc: cpu: use sparc_cpu_parse_features() directly Igor Mammedov
2016-06-10 11:52 ` Eduardo Habkost
2016-06-09 17:11 ` [Qemu-devel] [PATCH v2 4/6] cpu: use CPUClass->parse_features() as convertor to global properties Igor Mammedov
2016-06-14 19:47 ` [Qemu-devel] Handling errors caused by -global (was Re: [PATCH v2 4/6] cpu: use CPUClass->parse_features() as convertor to global properties) Eduardo Habkost
2016-06-14 21:41 ` Paolo Bonzini [this message]
2016-06-14 21:48 ` Eduardo Habkost
2016-06-21 13:24 ` [Qemu-devel] [PATCH v2 4/6] fixup! cpu: use CPUClass->parse_features() as convertor to global properties Igor Mammedov
2016-06-23 15:22 ` Eduardo Habkost
2016-06-09 17:11 ` [Qemu-devel] [PATCH v2 5/6] arm: virt: parse cpu_model only once Igor Mammedov
2016-06-09 17:11 ` [Qemu-devel] [PATCH v2 6/6] pc: parse cpu features " Igor Mammedov
2016-07-04 8:04 ` [Qemu-devel] [PATCH v2 0/6] cpus: make "-cpu cpux, features" global properties Igor Mammedov
2016-07-04 14:01 ` Eduardo Habkost
2016-07-04 14:32 ` Igor Mammedov
2016-07-04 16:21 ` Eduardo Habkost
2016-07-04 16:45 ` Greg Kurz
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=1646409152.22421731.1465940463160.JavaMail.zimbra@redhat.com \
--to=pbonzini@redhat.com \
--cc=armbru@redhat.com \
--cc=blauwirbel@gmail.com \
--cc=ehabkost@redhat.com \
--cc=imammedo@redhat.com \
--cc=mark.cave-ayland@ilande.co.uk \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).