From: Paolo Bonzini <pbonzini@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: kwolf@redhat.com, peter.maydell@linaro.org,
peter.crosthwaite@xilinx.com,
"Anthony Liguori" <aliguori@amazon.com>,
"Stefan Hajnoczi" <stefanha@gmail.com>,
qemu-devel@nongnu.org, stefanha@redhat.com,
"Andreas Färber" <afaerber@suse.de>
Subject: Re: [Qemu-devel] IDs in QOM
Date: Tue, 07 Oct 2014 17:14:38 +0200 [thread overview]
Message-ID: <5434035E.1040807@redhat.com> (raw)
In-Reply-To: <87ppe413de.fsf@blackfin.pond.sub.org>
Il 07/10/2014 14:16, Markus Armbruster ha scritto:
>> > Possibly, except this would propagate all the way through the APIs. For
>> > example, right now [*] is added automatically to MemoryRegion
>> > properties, but this can change in the future since many MemoryRegions
>> > do not need array-like names. Then you would have two sets of
>> > MemoryRegion creation APIs, one that array-ifies names and one that doesn't.
> Why couldn't you have a separate name generator there as well?
>
> QOM:
> * object_property_add() takes a non-magical name argument
> * object_gen_name() takes a base name and generates a stream of
> derived names suitable for object_property_add()
>
> Memory:
> * memory_region_init() takes a non-magical name argument
> * memory_gen_name() takes a base name... you get the idea
> actually a wrapper around object_gen_name()
I see what you mean; you could even reuse object_gen_name(). It looks
sane, I guess one has to see a patch to judge if it also _is_ sane. :)
> > > Why is it a good idea have two separate restrictions on property names?
> > > A loser one that applies always (anything but '\0' and '/'), and a
> > > stricter one that applies sometimes (letters, digits, '-', '.', '_',
> > > starting with a letter).
> > >
> > > If yes, how is "sometimes" defined?
> >
> > It applies to objects created by the user (either in
> > /machine/peripheral, or in /objects). Why the restriction? For
> > -object, because creating the object involves QemuOpts. You then have
> > two ways to satisfy the principle of least astonishment:
> >
> > 1) always use the same restriction when a user creates objects;
> >
> > 2) do not introduce restrictions when a user is not using QemuOpts.
> >
> > We've been doing (2) so far; often it is just because QMP wrappers also
> > used QemuOpts, but not necessarily. So object_add just does the same.
>
> We've been doing (2) so far simply because we've never wasted a thought
> on it! Since we're wasting thoughts now: which one do we like better?
User interfaces other than QOM have been doing (2) too.
netdev-add and device-add have been doing (2) because they use QemuOpts
under the hood.
blockdev-add has been consciously doing (2) for node-name.
chardev-add has been doing (1), and I'd argue that this is a bug in
chardev-add.
QOM has two families of operations.
One is -object/object-add/object-del. This is a high-level operation
that only works with specific QOM classes (those that implement
UserCreatable) and only operate on a specific part of the QOM tree
(/objects).
The other is qom-get/qom-set. This is a low-level operation that can
explore all of the QOM tree. It cannot _create_ new objects and
properties, however, so the user cannot escape the naming sandbox that
we put in place for him.
I think it's fair to limit the high-level operations to the same id
space, no matter if they're QemuOpts based or not.
> Based on experience, I'd rather not make "user-created"
> vs. "system-created" a hard boundary. Once a system-created funny name
> has become ABI, we can't ever let the user create it. One reason for me
> to prefer (1).
Anything that is outside /objects is "funny", not just anything that has
weird characters in its name. The QOM API consists of "magic" object
canonical paths and magic property names which, as far as I know, can be
easily listed:
* the aforementioned /machine.rtc-time that lets you detect missed
RTC_CHANGE events
* the /backend tree that includes info on the graphic consoles. Not
sure if this is considered stable, but it's there.
* /machine/peripheral/foo lets you peek at run-time properties of
-device id=foo - virtio-ballon has a couple of run-time properties,
whose status I am not certain of. Probably stable but undocumented.
* /objects/bar lets you reconstruct the properties of -object id=bar -
there are no such run-time properties with any promised stability.
In other words, practically all of the QOM API is outside /objects.
But not all hope is lost. Were we to provide user access to the
creation of graphic consoles, we could preserve the /backend API via
aliases and links. This way, anything that currently happens in
/machine or /backend can tomorrow happen in /objects, without breaking
backwards compatibility.
Similarly, a QOMified block-backend could be either:
* an object that QEMU creates for you when you give -device
scsi-disk,id=disk,drive=foo. The canonical path could be something like
/machine/peripheral/disk/drive-backend, with a link in
/machine/peripheral/disk/backend.
* an object that you create with -object
block-backend,id=bar,blockdev=myimg and reference with -device
scsi-disk,backend=bar. The canonical path would be of course
/objects/bar, but the same link would exist in
/machine/peripheral/disk/backend.
In either case, you would be able to find the block-backend using the
same QOM path and property.
> So the "automatic arrayification" convenience feature added a property
> name restriction. What makes us sure this is the last time we add name
> restrictions?
Nothing. However, does it matter, as long as the now-disallowed names
were not possible at all in -object/object_add?
Paolo
next prev parent reply other threads:[~2014-10-07 15:15 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-30 11:59 [Qemu-devel] [PATCH] util: Emancipate id_wellformed() from QemuOpts Markus Armbruster
2014-09-30 15:30 ` Eric Blake
2014-10-01 12:33 ` [Qemu-devel] IDs in QOM (was: [PATCH] util: Emancipate id_wellformed() from QemuOpts) Markus Armbruster
2014-10-02 13:21 ` Stefan Hajnoczi
2014-10-02 13:26 ` [Qemu-devel] IDs in QOM Andreas Färber
2014-10-02 14:10 ` Stefan Hajnoczi
2014-10-02 14:21 ` Markus Armbruster
2014-10-02 14:28 ` Andreas Färber
2014-10-02 14:59 ` Markus Armbruster
2014-10-02 17:41 ` Paolo Bonzini
2014-10-07 8:01 ` Markus Armbruster
2014-10-07 10:03 ` Paolo Bonzini
2014-10-07 12:16 ` Markus Armbruster
2014-10-07 15:14 ` Paolo Bonzini [this message]
2014-10-07 18:39 ` Markus Armbruster
2014-10-07 18:42 ` Paolo Bonzini
2014-10-07 18:41 ` Kevin Wolf
2014-10-07 18:45 ` Paolo Bonzini
2014-10-02 13:18 ` [Qemu-devel] [PATCH] util: Emancipate id_wellformed() from QemuOpts Stefan Hajnoczi
2014-10-02 13:42 ` Markus Armbruster
2014-10-02 14:11 ` Stefan Hajnoczi
2014-10-03 8:46 ` Stefan Hajnoczi
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=5434035E.1040807@redhat.com \
--to=pbonzini@redhat.com \
--cc=afaerber@suse.de \
--cc=aliguori@amazon.com \
--cc=armbru@redhat.com \
--cc=kwolf@redhat.com \
--cc=peter.crosthwaite@xilinx.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@gmail.com \
--cc=stefanha@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.