qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Anthony Liguori <anthony@codemonkey.ws>
To: Jan Kiszka <jan.kiszka@siemens.com>
Cc: Peter Maydell <peter.maydell@linaro.org>,
	"Edgar E. Iglesias" <edgar.iglesias@gmail.com>,
	Gerd Hoffmann <kraxel@redhat.com>,
	Markus Armbruster <armbru@redhat.com>,
	qemu-devel <qemu-devel@nongnu.org>
Subject: Re: [Qemu-devel] [RFC] Plan for moving forward with QOM
Date: Thu, 15 Sep 2011 09:11:41 -0500	[thread overview]
Message-ID: <4E72079D.5060103@codemonkey.ws> (raw)
In-Reply-To: <4E720103.7040100@siemens.com>

On 09/15/2011 08:43 AM, Jan Kiszka wrote:
> On 2011-09-15 00:11, Anthony Liguori wrote:
>> On 09/14/2011 04:15 PM, Jan Kiszka wrote:
>>> On 2011-09-14 21:42, Anthony Liguori wrote:
>>>>> Such names can get fairly long I'm afraid...
>>>>
>>>> A user should never even see these names.  A user probably will always
>>>> interact with devices via paths.
>>>
>>> Right.
>>> <scratching head>
>>> But will those automatic names be used at all then?
>>
>> Yes, because QEMU is not going to know anything about path names :-)
>
> I bet that's a needless self-restriction. What prevents reusing the
> introspection services that allow path resolutions on the client side
> also QEMU internally? It would enable us to skip any traps and pitfalls
> associated with unique device name construction. From a higher
> perspective, they are completely redundant.

I actually agree :-)

We should probably pick a path format and implement in QMP.  I think that 
discussion is orthogonal though.

>> Path names should be a concept that exists entirely in the client.  That
>> may be HMP or that may be a command line tool (like the proposed qemu
>> script).
>>
>> The only management interface exposed to the client is:
>>
>> create_object(type, name)
>> value = get_object_property(name, property_name)
>> void set_object_property(name, property_name, value)
>> props = list_object_properties(name)
>> names = list_objects()
>>
>> So names are very important from a QMP perspective, but not something
>> users every really see.
>
> I don't get the added value of something that looks almost like a path
> but is still not as readable at it (e.g. when debugging the communication).

It's two separate namespaces.  The name namespace is controlled by the user and 
we have to bend over backwards to avoid clashing with it.

The path namespace is controller by QEMU (more or less).

The name namespace also maps 1-1 to devices which means names can be used to 
represent devices.  They absolutely never change as long as the device never 
changes.

Paths maps N-1 to devices.  Paths may change but names never change.  I don't 
think there can ever be a fixed canonical path.

An example is a NIC with nvram that stores a mac address.  In QOM, the guest 
could change the mac address, then a user could hot unplug the device, and then 
hot plug the device into a different PCI slot.  The path is now different but 
the device name has not change.

>>  From a client perspective, yes.  The scripts I showed at KVM Forum had
>> '/' return the list of all user-created devices as the contents.  It's a
>> nice feature but I think it's something that lives in a client, not in
>> the object model.
>
> This is part of the object model as it defines the tree construction and
> if the root can only be a single target-specific device or a generic,
> invariant container. This '/' exception as defined so far looks odd to me.

I don't think I understand you're suggestion of having a special '/' device 
name.  I think we may be talking past each other.

In QOM, whenever a device is created, it's created with a name.  This basically is:

void type_init(void *memory, const char *name)
{
    global_object_hash_table[name] = memory;
}

Looking up a device by name is just a hash table lookup.  In the case of 
composition, you have:

struct MyDevice {
   struct MyComposedDevice foo;
   MyDevice *sibling;
};

void my_device_init(MyDevice *obj, const char *name)
{
     type_init(obj, name);
     type_init(&obj->foo, name + "::foo");
}

Which gives you two devices in the global hash table.  Links are created by 
basically having:

void my_device_set_sibling(MyDevice *obj, MyDevice *sibling)
{
    obj->sibling = sibling;
}

void my_device_init(MyDevice *obj, const char *name)
{
     ...
     type_add_property(&obj, "sibling", my_device_set_sibling, "link<MyDevice>");
}

type_add_property() has special sauce that lets you write the "sibling" property 
as a string, does the lookup and error checking, and ultimately calls 
my_device_set_sibling() with a Device * pointer.

There is no root.  You can create many completely separate graphs.

Regards,

Anthony Liguori

> Jan
>

  reply	other threads:[~2011-09-15 14:11 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
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 [this message]
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=4E72079D.5060103@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).