From: "Philippe Mathieu-Daudé" <philmd@linaro.org>
To: "Jonah Palmer" <jonah.palmer@oracle.com>,
"Markus Armbruster" <armbru@redhat.com>,
"Alex Bennée" <alex.bennee@linaro.org>
Cc: qemu-devel@nongnu.org, lvivier@redhat.com, mst@redhat.com,
qemu_oss@crudebyte.com, kraxel@redhat.com, si-wei.liu@oracle.com,
joao.m.martins@oracle.com, eblake@redhat.com,
qemu-block@nongnu.org, david@redhat.com, arei.gonglei@huawei.com,
marcandre.lureau@redhat.com, thuth@redhat.com,
michael.roth@amd.com, groug@kaod.org, dgilbert@redhat.com,
eric.auger@redhat.com, stefanha@redhat.com,
boris.ostrovsky@oracle.com, kwolf@redhat.com,
mathieu.poirier@linaro.org, raphael.norwitz@nutanix.com,
pbonzini@redhat.com
Subject: Re: [PATCH v15 1/6] qmp: add QMP command x-query-virtio
Date: Fri, 2 May 2025 00:15:06 +0200 [thread overview]
Message-ID: <988a1b63-de48-49b3-97c2-fd202865b0e8@linaro.org> (raw)
In-Reply-To: <3d3a1106-3a11-36e0-7446-96c338595198@oracle.com>
On 9/12/22 09:54, Jonah Palmer wrote:
>
> On 12/7/22 08:22, Markus Armbruster wrote:
>> Jonah Palmer<jonah.palmer@oracle.com> writes:
>>
>>> On 12/2/22 10:21, Markus Armbruster wrote:
>>>> Philippe Mathieu-Daudé<philmd@linaro.org> writes:
>>>>
>>>>> On 2/12/22 13:23, Jonah Palmer wrote:
>>>>>> On 11/30/22 11:16, Philippe Mathieu-Daudé wrote:
>>>>>>> Hi,
>>>>>>>
>>>>>>> On 11/8/22 14:24, Jonah Palmer wrote:
>>>>>>>> From: Laurent Vivier<lvivier@redhat.com>
>>>>>>>>
>>>>>>>> This new command lists all the instances of VirtIODevices with
>>>>>>>> their canonical QOM path and name.
>>>>>>>>
>>>>>>>> [Jonah: @virtio_list duplicates information that already exists in
>>>>>>>> the QOM composition tree. However, extracting necessary information
>>>>>>>> from this tree seems to be a bit convoluted.
>>>>>>>>
>>>>>>>> Instead, we still create our own list of realized virtio devices
>>>>>>>> but use @qmp_qom_get with the device's canonical QOM path to confirm
>>>>>>>> that the device exists and is realized. If the device exists but
>>>>>>>> is actually not realized, then we remove it from our list (for
>>>>>>>> synchronicity to the QOM composition tree).
>>>> How could this happen?
>>>>
>>>>>>>> Also, the QMP command @x-query-virtio is redundant as @qom-list
>>>>>>>> and @qom-get are sufficient to search '/machine/' for realized
>>>>>>>> virtio devices. However, @x-query-virtio is much more convenient
>>>>>>>> in listing realized virtio devices.]
>>>>>>>>
>>>>>>>> Signed-off-by: Laurent Vivier<lvivier@redhat.com>
>>>>>>>> Signed-off-by: Jonah Palmer<jonah.palmer@oracle.com>
>>>>>>>> ---
>>>>>>>> hw/virtio/meson.build | 2 ++
>>>>>>>> hw/virtio/virtio-stub.c | 14 ++++++++
>>>>>>>> hw/virtio/virtio.c | 44 ++++++++++++++++++++++++
>>>>>>>> include/hw/virtio/virtio.h | 1 +
>>>>>>>> qapi/meson.build | 1 +
>>>>>>>> qapi/qapi-schema.json | 1 +
>>>>>>>> qapi/virtio.json | 68 ++++++++++++++++++++++++++++++++++++++
>>>>>>>> tests/qtest/qmp-cmd-test.c | 1 +
>>>>>>>> 8 files changed, 132 insertions(+)
>>>>>>>> create mode 100644 hw/virtio/virtio-stub.c
>>>>>>>> create mode 100644 qapi/virtio.json
>>>>>>>> diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
>>>>>>>> index 5d607aeaa0..bdfa82e9c0 100644
>>>>>>>> --- a/hw/virtio/virtio.c
>>>>>>>> +++ b/hw/virtio/virtio.c
>>>>>>>> @@ -13,12 +13,18 @@
>>>>>>>> #include "qemu/osdep.h"
>>>>>>>> #include "qapi/error.h"
>>>>>>>> +#include "qapi/qmp/qdict.h"
>>>>>>>> +#include "qapi/qapi-commands-virtio.h"
>>>>>>>> +#include "qapi/qapi-commands-qom.h"
>>>>>>>> +#include "qapi/qapi-visit-virtio.h"
>>>>>>>> +#include "qapi/qmp/qjson.h"
>>>>>>>> #include "cpu.h"
>>>>>>>> #include "trace.h"
>>>>>>>> #include "qemu/error-report.h"
>>>>>>>> #include "qemu/log.h"
>>>>>>>> #include "qemu/main-loop.h"
>>>>>>>> #include "qemu/module.h"
>>>>>>>> +#include "qom/object_interfaces.h"
>>>>>>>> #include "hw/virtio/virtio.h"
>>>>>>>> #include "migration/qemu-file-types.h"
>>>>>>>> #include "qemu/atomic.h"
>>>>>>>> @@ -29,6 +35,9 @@
>>>>>>>> #include "sysemu/runstate.h"
>>>>>>>> #include "standard-headers/linux/virtio_ids.h"
>>>>>>>> +/* QAPI list of realized VirtIODevices */
>>>>>>>> +static QTAILQ_HEAD(, VirtIODevice) virtio_list;
>>>>>>>> +
>>>>>>>> /*
>>>>>>>> * The alignment to use between consumer and producer parts of vring.
>>>>>>>> * x86 pagesize again. This is the default, used by transports like PCI
>>>>>>>> @@ -3698,6 +3707,7 @@ static void virtio_device_realize(DeviceState *dev, Error **errp)
>>>>>>>> vdev->listener.commit = virtio_memory_listener_commit;
>>>>>>>> vdev->listener.name = "virtio";
>>>>>>>> memory_listener_register(&vdev->listener, vdev->dma_as);
>>>>>>>> + QTAILQ_INSERT_TAIL(&virtio_list, vdev, next);
>>>>>>>> }
>>>>>>>> static void virtio_device_unrealize(DeviceState *dev)
>>>>>>>> @@ -3712,6 +3722,7 @@ static void virtio_device_unrealize(DeviceState *dev)
>>>>>>>> vdc->unrealize(dev);
>>>>>>>> }
>>>>>>>> + QTAILQ_REMOVE(&virtio_list, vdev, next);
>>>>>>>> g_free(vdev->bus_name);
>>>>>>>> vdev->bus_name = NULL;
>>>>>>>> }
>>>>>>>> @@ -3885,6 +3896,8 @@ static void virtio_device_class_init(ObjectClass *klass, void *data)
>>>>>>>> vdc->stop_ioeventfd = virtio_device_stop_ioeventfd_impl;
>>>>>>>> vdc->legacy_features |= VIRTIO_LEGACY_FEATURES;
>>>>>>>> +
>>>>>>>> + QTAILQ_INIT(&virtio_list);
>>>>>>>> }
>>>>>>>> bool virtio_device_ioeventfd_enabled(VirtIODevice *vdev)
>>>>>>>> @@ -3895,6 +3908,37 @@ bool virtio_device_ioeventfd_enabled(VirtIODevice *vdev)
>>>>>>>> return virtio_bus_ioeventfd_enabled(vbus);
>>>>>>>> }
>>>>>>>> +VirtioInfoList *qmp_x_query_virtio(Error **errp)
>>>>>>>> +{
>>>>>>>> + VirtioInfoList *list = NULL;
>>>>>>>> + VirtioInfoList *node;
>>>>>>>> + VirtIODevice *vdev;
>>>>>>>> +
>>>>>>>> + QTAILQ_FOREACH(vdev, &virtio_list, next) {
>>>>>>>> + DeviceState *dev = DEVICE(vdev);
>>>>>>>> + Error *err = NULL;
>>>>>>>> + QObject *obj = qmp_qom_get(dev->canonical_path, "realized", &err);
>>>>>>>> +
>>>>>>>> + if (err == NULL) {
>>>>>>>> + GString *is_realized = qobject_to_json_pretty(obj, true);
>>>>>>>> + /* virtio device is NOT realized, remove it from list */
>>>>>>> Why not check dev->realized instead of calling qmp_qom_get() & qobject_to_json_pretty()?
>>>>>> This check queries the QOM composition tree to check that the device actually exists and is
>>>>>> realized. In other words, we just want to confirm with the QOM composition tree for the device.
>>>> Again, how could this happen?
>>>>
>>>> If @virtio_list isn't reliable, why have it in the first place?
>>> Honestly, I'm not sure how this even could happen, since the @virtio_list is managed at the realization
>>> and unrealization of a virtio device. Given this, I do feel as though the list is reliable, although
>>> this might just benaïve of me to say. After giving this a second look, the @virtio_list is only really needed to provide a nice list of all realized virtio devices
>>> on the system, along with their full canonical paths. If the user can find the canonical path of a virtio device by searching the QOM
>>> composition tree, and assuming we can get a @VirtioDevice object (in code) from this canonical path, then the rest of the QMP/HMP features of
>>> these patches could be done by solely by searching the QOM composition tree. However, I think having this list of realized virtio devices as a
>>> subset of the QOM composition tree is worth its weight, since the user no longer has to search the entire tree to find virtio devices and piece
>>> together their canonical paths. Of course, if we're somehow able to generate a similar list in code by searching the QOM composition tree,
>>> then there would be no need for this @virtio_list. However, it's really not clear how, or if, such a list could be generated by parsing the QOM
>>> composition tree.
>> I'm not debating whether to have the command right now. I'm debating
>> the introduction of variable @virtio_list. Please consider...
>>
>>>>>> This was done to have some kind of synchronicity between @virtio_list and the QOM composition
>>>>>> tree, since the list duplicates information that already exists in the tree.
>>>>>> This check was recommended in v10 and added in v11 of this patch series.
>>>>> Thanks, I found Markus comments:
>>>>>
>>>>> v10:
>>>>> https://urldefense.com/v3/__https://lore.kernel.org/qemu-
>>>>> devel/87ee6ogbiw.fsf@dusky.pond.sub.org/__;!!ACWV5N9M2RV99hQ!
>>>>> LqeLFhE8PtTTg_qKRuP9Kgz5pyTNZLhYeRzp4a2oS8c3D5W8-
>>>>> irZoBW0L_Lf1ozm3qYidYhuVrjxjsAw$
>> ... this:
>>
>>>> My recommendation there was to *delete* virtio_list and search the QOM
>>>> composition tree instead:
>>>>
>>>> @virtio_list duplicates information that exists in the QOM composition
>>>> tree. It needs to stay in sync. You could search the composition tree
>>>> instead.
>>>>
>>>> The QOM composition tree is the source of truth.
>> Let me tell you a tale of two patches.
>>
>> One created a niche QMP command. It also modified core infrastructure
>> to keep additional state. State that needed to be kept consistent with
>> existing state forever. Consistency was not entirely obvious. The
>> command examined this new state. The examination was simple.
>>
>> The other one created a niche QMP command, and nothing more. The
>> command examined state without changing it. The examination was
>> less simple.
And 3 years later I hit this niche command while trying to remove a
legacy field...
commit 4987e5bf2e9262094fd89d2b8e4d5bd6c4c7312f
+ /**
+ * @use_started: true if the @started flag should be used to check
+ * the current state of the VirtIO device. Otherwise status bits
+ * should be checked for a current status of the device.
+ * @use_started is only set via QMP and defaults to true for all
+ * modern machines (since 4.1).
+ */
(we are removing all machines up to 4.0)
>>
>> One of the two patches had a much easier time in review. Which one
>> could it be...
>>
>> Please give the other approach a serious try.
>
> Ah, okay. I see where you're getting at.
>
> Sure, I can give this approach a try and see what I can do with it.
> Just FYI, I wont be able to get to this right away until sometime early
> next year.
>
> Jonah
>
>> [...]
>>
next prev parent reply other threads:[~2025-05-01 22:16 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-11 12:24 [PATCH v15 0/6] hmp,qmp: Add commands to introspect virtio devices Jonah Palmer
2022-08-11 12:24 ` [PATCH v15 1/6] qmp: add QMP command x-query-virtio Jonah Palmer
2022-11-30 16:16 ` Philippe Mathieu-Daudé
2022-12-02 12:23 ` Jonah Palmer
2022-12-02 14:17 ` Philippe Mathieu-Daudé
2022-12-02 15:21 ` Markus Armbruster
2022-12-07 8:47 ` Jonah Palmer
2022-12-07 13:22 ` Markus Armbruster
2022-12-09 8:54 ` Jonah Palmer
2025-05-01 22:15 ` Philippe Mathieu-Daudé [this message]
2022-08-11 12:24 ` [PATCH v15 2/6] qmp: add QMP command x-query-virtio-status Jonah Palmer
2025-05-01 22:09 ` Philippe Mathieu-Daudé
2025-05-05 6:30 ` Thomas Huth
2025-05-05 7:29 ` Laurent Vivier
2025-05-08 7:51 ` Markus Armbruster
2025-05-08 10:44 ` Philippe Mathieu-Daudé
2022-08-11 12:24 ` [PATCH v15 3/6] qmp: decode feature & status bits in virtio-status Jonah Palmer
2022-08-11 12:24 ` [PATCH v15 4/6] qmp: add QMP commands for virtio/vhost queue-status Jonah Palmer
2022-08-11 12:24 ` [PATCH v15 5/6] qmp: add QMP command x-query-virtio-queue-element Jonah Palmer
2022-08-11 12:24 ` [PATCH v15 6/6] hmp: add virtio commands Jonah Palmer
2022-09-27 8:36 ` [PATCH v15 0/6] hmp,qmp: Add commands to introspect virtio devices Jonah Palmer
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=988a1b63-de48-49b3-97c2-fd202865b0e8@linaro.org \
--to=philmd@linaro.org \
--cc=alex.bennee@linaro.org \
--cc=arei.gonglei@huawei.com \
--cc=armbru@redhat.com \
--cc=boris.ostrovsky@oracle.com \
--cc=david@redhat.com \
--cc=dgilbert@redhat.com \
--cc=eblake@redhat.com \
--cc=eric.auger@redhat.com \
--cc=groug@kaod.org \
--cc=joao.m.martins@oracle.com \
--cc=jonah.palmer@oracle.com \
--cc=kraxel@redhat.com \
--cc=kwolf@redhat.com \
--cc=lvivier@redhat.com \
--cc=marcandre.lureau@redhat.com \
--cc=mathieu.poirier@linaro.org \
--cc=michael.roth@amd.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu_oss@crudebyte.com \
--cc=raphael.norwitz@nutanix.com \
--cc=si-wei.liu@oracle.com \
--cc=stefanha@redhat.com \
--cc=thuth@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 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).