From: Paolo Bonzini <pbonzini@redhat.com>
To: Anthony Liguori <anthony@codemonkey.ws>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [RFC][PATCH 0/21] QEMU Object Model
Date: Tue, 26 Jul 2011 16:35:22 +0200 [thread overview]
Message-ID: <4E2ED0AA.3020101@redhat.com> (raw)
In-Reply-To: <4E2EC90E.8090409@codemonkey.ws>
On 07/26/2011 04:02 PM, Anthony Liguori wrote:
>> Also because there is no hierarchy, composition in host devices can be
>> done very easily. A decorator for char/block devices, such as a "tee"
>> device, can treat the wrapped object(s) the same independent of the
>> actual class. A simple vtable works very well. GObject would also do
>> well, unifying the introspection at the cost of significantly more
>> boilerplate.
>
> The polymorphism model of QOM is identical to GObject so I'm not sure
> what you mean here.
GObject instead of QOM (just so that we have something that is already
written).
> In the case of tee, it's just an object with two sockets.
Yes, understood.
> I have PCI patches, but didn't post them in the series. Here's how it
> works:
>
> The PCI host controller, the i440fx, has 32 sockets of PCIDevice.
> PCIDevice is a base class.
And as such it can add data members. But when a device is on two buses,
you cannot have both of them adding data members. I know MI is hard to
get right, and in fact I'm not proposing to do MI---not even interface
inheritance. I don't want to have any base class but DeviceState.
> The PCI host controller implements a PCIBus interface. The PCIDevices
> have a socket of a PCIBus
>
> Connecting a PCIDevice to the host bus involves setting the socket on
> the PCI host controller with the PCIDevice and then setting the
> PCIDevice's bus socket with the host controller.
>
> A PCIDevice can also be a PCIBus by implementing the PCIBus interface.
> This is what enables a PCI bridge to make sense in this model.
>
> If you're interested, the tree that has this is
> http://repo.or.cz/w/qemu/aliguori.git/tree/qdev2:/devices
Yes, this is pretty much what I had imagined. But it does not scale to
a topology where you have two parents, both of which want to add data
members.
>> 1) in a flexible manner, so that it can express complex topologies (as
>> long as "plugs" and "sockets" have the same shape of course);
>
> Right, this is what we do today in QOM. Plugs and Sockets are typed.
> Those types can be interfaces or base classes so there's a lot of
> flexibility.
Interfaces (is-a) are less flexible than embedded objects (has-a).
> There are no properties of the socket.
>
> If you look at something like adding a PCI device in qdev, you add a
> child and set properties of the child to identify how the device sits on
> the PCI bus.
>
> I'd characterize this as awkward, at best. The slot index is not a
> property of the device, it's a property of how the device is connected
> to the PCI bus.
Yes, for a PCI address I agree. But in a (parallel) SCSI bus, the LUN
is logically a property of the device. Same as IDE when you used to set
jumpers to choose master/slave. Or ISA interrupt lines.
Once you have something like this for a device that bridges two buses,
interfaces require a lot of boilerplate for useless getters/setters.
> i440fx->slots[3] = mydevice
>
> Likewise, if slot 4 contains a PCI-to-PCI bridge that ends up being bus
> 1, and you want to assign to bus 1, slot 2, fn 0:
>
> i440fx->slots[4]->slots[2] = myotherdevice;
>
> Now you may observe that this is awkward compared to saying "bus 1".
No, I have no problem with that. :)
> The same applies equally to IDE.
>
> ide->primary.master = disk1;
> ide->secondary.master = cdrom;
For IDE, an equally good model would be:
ide->primary.add(disk1);
disk1.masterSlave = MASTER;
ide->secondary.add(cdrom);
cdrom.masterSlave = MASTER;
>> 5) convert buses to compound properties. Rather than inheriting from
>> PCIDevice, a PCI device would inherit straight from DeviceState and
>> include a PCIDevice struct that defines the backlink from a device to
>> its parent. Note that since we're using C, this is not a big change from
>> what we're doing now! (Inheritance by containment is a special case of
>> containment.) And it allows to define very flexibly a device that would
>> have to sit on two or more buses in the current qdev model. More
>> importantly, it keeps the effectiveness of the qbus ops model, while
>> removing the constraint of a tree topology.
>
> Interfaces are the right way to do this. Getting MI right is fairly hard
But we don't need is-a, we need has-a. Multiple is-a is harder than
single is-a. Multiple has-a does not add any complication.
> I think all of the requirements you've outlined are currently handled in
> QOM.
They more than likely are. The question is whether they're handled in
the most programmer-efficient manner, and whether the advantages of a
single grand unified object model for host and guest devices is worth
the effort.
Paolo
next prev parent reply other threads:[~2011-07-26 14:35 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-07-25 1:44 [Qemu-devel] [RFC][PATCH 0/21] QEMU Object Model Anthony Liguori
2011-07-25 1:44 ` [Qemu-devel] [PATCH 01/21] qom: add make infrastructure Anthony Liguori
2011-07-25 1:44 ` [Qemu-devel] [PATCH 02/21] qom: convert QAPI to use Qconfig build system Anthony Liguori
2011-07-25 1:44 ` [Qemu-devel] [PATCH 03/21] qom: Add core type system Anthony Liguori
2011-07-25 1:44 ` [Qemu-devel] [PATCH 04/21] qom: add Plug class Anthony Liguori
2011-07-25 1:44 ` [Qemu-devel] [PATCH 05/21] plug: add Plug property type Anthony Liguori
2011-07-25 1:44 ` [Qemu-devel] [PATCH 06/21] plug: add socket " Anthony Liguori
2011-07-25 1:44 ` [Qemu-devel] [PATCH 07/21] plug: add generated property types Anthony Liguori
2011-07-25 1:44 ` [Qemu-devel] [PATCH 08/21] qom: add plug_create QMP command Anthony Liguori
2011-07-25 1:44 ` [Qemu-devel] [PATCH 09/21] qom: add plug_list " Anthony Liguori
2011-07-25 1:44 ` [Qemu-devel] [PATCH 10/21] qom: add plug_get " Anthony Liguori
2011-07-25 1:44 ` [Qemu-devel] [PATCH 11/21] qom: add plug_set " Anthony Liguori
2011-07-25 1:44 ` [Qemu-devel] [PATCH 12/21] qom: add plug_list_props " Anthony Liguori
2011-07-25 1:44 ` [Qemu-devel] [PATCH 13/21] qom: add plug_destroy command Anthony Liguori
2011-07-25 1:44 ` [Qemu-devel] [PATCH 14/21] qom: add example qsh command Anthony Liguori
2011-07-25 1:44 ` [Qemu-devel] [PATCH 15/21] qom: add Device class Anthony Liguori
2011-07-27 15:10 ` Peter Maydell
2011-07-27 16:07 ` Anthony Liguori
2011-07-25 1:44 ` [Qemu-devel] [PATCH 16/21] qom-devices: add a Pin class Anthony Liguori
2011-07-25 1:44 ` [Qemu-devel] [PATCH 17/21] qom: add CharDriver class Anthony Liguori
2011-07-25 1:44 ` [Qemu-devel] [PATCH 18/21] qom-chrdrv: add memory character driver Anthony Liguori
2011-07-25 1:44 ` [Qemu-devel] [PATCH 19/21] qom-chrdrv: add Socket base class Anthony Liguori
2011-07-25 1:44 ` [Qemu-devel] [PATCH 20/21] qom-chrdrv: add TCPServer class Anthony Liguori
2011-07-25 1:44 ` [Qemu-devel] [PATCH 21/21] qom-chrdrv: add UnixServer Anthony Liguori
2011-07-25 11:21 ` [Qemu-devel] [RFC][PATCH 0/21] QEMU Object Model Kevin Wolf
2011-07-25 12:45 ` Anthony Liguori
2011-07-25 13:08 ` Kevin Wolf
2011-07-25 13:10 ` Anthony Liguori
2011-07-26 12:59 ` Paolo Bonzini
2011-07-26 14:02 ` Anthony Liguori
2011-07-26 14:35 ` Paolo Bonzini [this message]
2011-07-26 15:34 ` Anthony Liguori
2011-07-26 18:26 ` Paolo Bonzini
2011-07-26 19:23 ` Anthony Liguori
2011-07-27 8:55 ` Paolo Bonzini
2011-07-27 12:48 ` Anthony Liguori
2011-07-27 15:33 ` Paolo Bonzini
2011-07-27 16:19 ` Anthony Liguori
2011-07-27 16:28 ` Anthony Liguori
2011-07-27 18:51 ` Paolo Bonzini
2011-07-27 20:01 ` Anthony Liguori
2011-07-28 7:36 ` Paolo Bonzini
2011-07-28 12:46 ` Anthony Liguori
2011-07-28 13:50 ` Paolo Bonzini
2011-07-28 14:03 ` Anthony Liguori
2011-07-28 14:41 ` Paolo Bonzini
2011-07-28 15:04 ` Anthony Liguori
2011-07-28 15:47 ` Paolo Bonzini
2011-07-28 17:59 ` Anthony Liguori
2011-07-29 7:19 ` Paolo Bonzini
2011-07-27 21:33 ` Peter Maydell
2011-07-27 22:31 ` Anthony Liguori
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=4E2ED0AA.3020101@redhat.com \
--to=pbonzini@redhat.com \
--cc=anthony@codemonkey.ws \
--cc=qemu-devel@nongnu.org \
/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.