From: Anthony Liguori <anthony@codemonkey.ws>
Cc: Peter Maydell <peter.maydell@linaro.org>,
Jan Kiszka <jan.kiszka@siemens.com>,
qemu-devel <qemu-devel@nongnu.org>,
Markus Armbruster <armbru@redhat.com>,
Gerd Hoffmann <kraxel@redhat.com>,
"Edgar E. Iglesias" <edgar.iglesias@gmail.com>
Subject: Re: [Qemu-devel] [RFC] Plan for moving forward with QOM
Date: Wed, 14 Sep 2011 13:49:00 -0500 [thread overview]
Message-ID: <4E70F71C.8040806@codemonkey.ws> (raw)
In-Reply-To: <4E70EC90.8000904@us.ibm.com>
On 09/14/2011 01:04 PM, Anthony Liguori wrote:
> Hi,
>
> I spent a couple hours today writing up some comparisons and an initial task
> list for converting qdev to QOM. The main location of this is the wiki[1] but I
> thought I would inline it here for easier commenting.
>
> I decided to do this because I wanted to avoid a massively long 00 patch
> explaining the rationale for the first batch of changes that I'm going to send out.
>
> There is so much complexity in qdev and the device model in general that it's
> hard to come up with a concise document. I'd really appreciate suggestions for
> topics to write up more rationale as that would help me avoid writing a book on
> the topic :-)
>
> [1] http://wiki.qemu.org/Features/QOM
>
> == Device Relationships ==
>
> === Device Relationships in QDev ===
>
> The two main concepts in QDev are devices and busses. A device is represented
> by a DeviceState and a bus is represented by a BusState. They do not share a
> common base class. Devices can have properties but busses cannot. A device
> has no direct relationship with other devices. The only relationship is
> indirect through busses.
>
> A device may have zero or more busses associated with it via a has-a
> relationship. Each child bus may have multiple devices associated with it via
> a reference. All devices have a single parent bus and all busses have a single
> parent device. These relationships form a strict tree where every alternating
> level is a bus level followed by a device level. The root of the tree is the
> main system bus often referred to as SysBus.
>
> === Device Relationships in QOM ===
>
> Everything in QOM is a device. The concept of busses are implemented as an
> interface that a device implements. Devices can have two types of relationships
> with other devices: device composition or device backlinks. Device composition
> involves one device directly creating another device. It will own life cycle
> management for the created device and will generally propagate events to that
> device (although there are exceptions).
>
> Device backlinks allow one device to refer to another device in a looser
> fashion. While there can be only one device composition relationship that
> exists between two specific devices, a device can participate in an arbitrary
> number of backlinks.
>
> Device composition and backlinks are both strongly typed and can be typed as a
> specific device type or as an interface. When typed as an interface, any
> device that implements that interface can be used.
>
> There is no explicit notion of parents in QOM. A typical bus relationship
> would the bus having a backlink to the child device, and the child device having
> a backlink to the bus.
>
> Without device backlinks, device composition forms a multi-rooted strict tree.
> With backlinks, the result are multiple directed graphs.
Peter often points out that he dislikes the directed nature of the graph links
in QOM. I assume he will again so I'll pre-emptively address it :-)
The reason they're directed is because that maps very well to C. Here's an
example of how these properties map to C:
struct I440FX {
Device parent;
PIIX3 piix3; // device composition
PciDevice *slots[32]; // device backlink
};
An embedded struct is device composition, a pointer to a struct is a backlink.
Since with device composition, you can only have a link between two nodes, you
could conceivably add a 'Device *parent' backlink to the Device class which
could get filled out for any instance of device composition. I dislike this
approach because there's not a whole lot of useful things you can do with a
Device and I suspect most people would upcast it to something else. I think
it's far better to have an explicitly typed backlink for those cases where
composition also involves a bidirectional relationship between devices.
In this specific example, the PIIX3 is-a PciDevice and all PciDevices have a
PciBus *bus backlink. That's whole the piix3 should talk to the PciBus IMHO as
opposed to relying on the composition link.
A bidirectional backlink is even harder to map to C. I'm not really sure how
you would do it. I'm not necessarily opposed to notion of having bidirectional
links by default but I just don't see a good mapping to something practical.
Regards,
Anthony Liguori
next prev parent reply other threads:[~2011-09-14 18:49 UTC|newest]
Thread overview: 88+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-09-14 18:04 [Qemu-devel] [RFC] Plan for moving forward with QOM Anthony Liguori
2011-09-14 18:49 ` Anthony Liguori [this message]
2011-09-14 19:30 ` Jan Kiszka
2011-09-14 19:42 ` Anthony Liguori
2011-09-14 21:15 ` Jan Kiszka
2011-09-14 22:11 ` Anthony Liguori
2011-09-15 13:43 ` Jan Kiszka
2011-09-15 14:11 ` Anthony Liguori
2011-09-15 16:38 ` Jan Kiszka
2011-09-15 18:01 ` Anthony Liguori
2011-09-16 10:12 ` Kevin Wolf
2011-09-16 13:00 ` Anthony Liguori
2011-09-14 20:00 ` Edgar E. Iglesias
2011-09-14 20:22 ` Anthony Liguori
2011-09-14 20:27 ` Edgar E. Iglesias
2011-09-14 20:37 ` Blue Swirl
2011-09-14 21:25 ` Anthony Liguori
2011-09-15 6:31 ` Gleb Natapov
2011-09-15 10:49 ` Stefan Hajnoczi
2011-09-15 13:08 ` Anthony Liguori
2011-09-15 13:17 ` Anthony Liguori
2011-09-15 14:23 ` Gleb Natapov
2011-09-16 14:46 ` John Williams
2011-09-16 16:10 ` Anthony Liguori
2011-09-17 1:11 ` Edgar E. Iglesias
2011-09-17 2:12 ` Anthony Liguori
2011-09-17 2:35 ` Edgar E. Iglesias
2011-09-15 13:57 ` Anthony Liguori
2011-09-15 14:14 ` Paolo Bonzini
2011-09-15 14:25 ` Gleb Natapov
2011-09-15 15:28 ` Anthony Liguori
2011-09-15 15:38 ` Gleb Natapov
2011-09-15 16:33 ` Anthony Liguori
2011-09-15 16:59 ` Gleb Natapov
2011-09-15 17:51 ` Anthony Liguori
2011-09-15 20:29 ` Gleb Natapov
2011-09-15 20:45 ` Peter Maydell
2011-09-15 21:15 ` Anthony Liguori
2011-09-16 16:33 ` Gleb Natapov
2011-09-16 17:47 ` Peter Maydell
2011-09-16 18:08 ` Anthony Liguori
2011-09-16 18:22 ` Gleb Natapov
2011-09-16 18:42 ` Anthony Liguori
2011-09-16 19:13 ` Gleb Natapov
2011-09-16 19:29 ` Anthony Liguori
2011-09-16 20:48 ` Gleb Natapov
2011-09-16 21:03 ` Anthony Liguori
2011-09-17 0:01 ` Edgar E. Iglesias
2011-09-16 18:18 ` Gleb Natapov
2011-09-15 20:50 ` Anthony Liguori
2011-09-16 16:47 ` Gleb Natapov
2011-09-17 0:48 ` Edgar E. Iglesias
2011-09-17 2:17 ` Anthony Liguori
2011-09-17 2:29 ` Anthony Liguori
2011-09-17 2:41 ` Edgar E. Iglesias
2011-09-15 6:47 ` Paolo Bonzini
2011-09-15 13:26 ` Anthony Liguori
2011-09-15 13:35 ` Paolo Bonzini
2011-09-15 13:54 ` Peter Maydell
2011-09-15 14:18 ` Anthony Liguori
2011-09-15 14:33 ` Paolo Bonzini
2011-09-15 14:48 ` Peter Maydell
2011-09-15 15:31 ` Anthony Liguori
2011-09-15 15:47 ` Paolo Bonzini
2011-09-15 20:23 ` Avi Kivity
2011-09-15 20:52 ` Anthony Liguori
2011-09-18 7:56 ` Avi Kivity
2011-09-18 14:00 ` Avi Kivity
2011-09-16 9:36 ` Gerd Hoffmann
2011-12-13 4:47 ` Paul Brook
2011-12-13 13:22 ` Anthony Liguori
2011-12-13 17:40 ` Paul Brook
2011-12-13 18:00 ` Anthony Liguori
2011-12-13 20:36 ` Paul Brook
2011-12-13 21:53 ` Anthony Liguori
2011-12-14 0:39 ` Paul Brook
2011-12-14 13:53 ` Anthony Liguori
2011-12-14 14:01 ` Avi Kivity
2011-12-14 14:11 ` Anthony Liguori
2011-12-14 14:35 ` Avi Kivity
2011-12-14 14:46 ` Anthony Liguori
2011-12-14 14:50 ` Avi Kivity
2011-12-15 18:59 ` Paul Brook
2011-12-15 19:12 ` Anthony Liguori
2011-12-15 21:28 ` Paul Brook
2011-12-16 2:08 ` Anthony Liguori
2011-12-16 5:11 ` Paul Brook
2011-12-14 9:11 ` Andreas Färber
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=4E70F71C.8040806@codemonkey.ws \
--to=anthony@codemonkey.ws \
--cc=armbru@redhat.com \
--cc=edgar.iglesias@gmail.com \
--cc=jan.kiszka@siemens.com \
--cc=kraxel@redhat.com \
--cc=peter.maydell@linaro.org \
--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 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).