Re: [PATCH v7 3/8] qmp: add QMP command x-debug-query-virtio
On Tue, Oct 05, 2021 at 04:24:21PM -0500, Eric Blake wrote: > On Tue, Oct 05, 2021 at 12:45:48PM -0400, Jonah Palmer wrote: > > From: Laurent Vivier > > > > This new command lists all the instances of VirtIODevice with > > their QOM paths and virtio type/name. > > > > Signed-off-by: Jonah Palmer > > --- > > hw/virtio/meson.build | 2 ++ > > hw/virtio/virtio-stub.c| 14 ++ > > hw/virtio/virtio.c | 27 +++ > > include/hw/virtio/virtio.h | 1 + > > qapi/meson.build | 1 + > > qapi/qapi-schema.json | 1 + > > qapi/virtio.json | 66 > > ++ > > tests/qtest/qmp-cmd-test.c | 1 + > > 8 files changed, 113 insertions(+) > > create mode 100644 hw/virtio/virtio-stub.c > > create mode 100644 qapi/virtio.json > > > > [Jonah: VirtioInfo member 'type' is now of type string and no longer > > relies on defining a QAPI list of virtio device type enumerations > > to match the VirtIODevice name with qapi_enum_parse().] > > Hmm; depending on how much information you want to cram in strings, we > may want to rebase this series on top of Dan's work to add the > HumanReadableText QAPI type: > https://lists.gnu.org/archive/html/qemu-devel/2021-09/msg07717.html The HumanReadableText type is only needed for commands that return entirely unstructured data, eg returns a HumanReadableText, or an array of HumanReadableText. The command here is returning semi-structured data, so I don't think it needs to depend on HumanReadableText. > > > +++ b/qapi/virtio.json > > @@ -0,0 +1,66 @@ > > +# -*- Mode: Python -*- > > +# vim: filetype=python > > +# > > + > > +## > > +# = Virtio devices > > +## > > + > > +## > > +# @VirtioInfo: > > +# > > +# Information about a given VirtIODevice > > +# > > +# @path: VirtIO device canonical QOM path. > > +# > > +# @type: VirtIO device name. > > +# > > +# Since: 6.2 > > +# > > +## > > +{ 'struct': 'VirtioInfo', > > +'data': { > > +'path': 'str', > > +'type': 'str' > > +} > > +} > > + > > +## > > +# @x-debug-query-virtio: > > +# > > +# Return a list of all initalized VirtIO devices > > +# > > +# Returns: list of gathered @VirtioInfo devices > > +# > > +# Since: 6.2 > > +# > > +# Example: > > +# > > +# -> { "execute": "x-debug-query-virtio" } > > +# <- { "return": [ > > +#{ > > +#"path": "/machine/peripheral-anon/device[4]/virtio-backend", > > +#"type": "virtio-input" > > +#}, > > +#{ > > +#"path": "/machine/peripheral/crypto0/virtio-backend", > > +#"type": "virtio-crypto" > > +#}, > > +#{ > > +#"path": "/machine/peripheral-anon/device[2]/virtio-backend", > > +#"type": "virtio-scsi" > > +#}, > > +#{ > > +#"path": "/machine/peripheral-anon/device[1]/virtio-backend", > > +#"type": "virtio-net" > > +#}, > > +#{ > > +#"path": "/machine/peripheral-anon/device[0]/virtio-backend", > > +#"type": "virtio-serial" > > +#} > > +# ] > > +#} > > +# > > +## > > + > > +{ 'command': 'x-debug-query-virtio', 'returns': ['VirtioInfo'] } > > But for now, it looks like 'str' is the correct type. > > > -- > Eric Blake, Principal Software Engineer > Red Hat, Inc. +1-919-301-3266 > Virtualization: qemu.org | libvirt.org > Regards, Daniel -- |: https://berrange.com -o-https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o-https://fstop138.berrange.com :| |: https://entangle-photo.org-o-https://www.instagram.com/dberrange :|
Re: [PATCH v7 3/8] qmp: add QMP command x-debug-query-virtio
On Tue, Oct 05, 2021 at 12:45:48PM -0400, Jonah Palmer wrote: > From: Laurent Vivier > > This new command lists all the instances of VirtIODevice with > their QOM paths and virtio type/name. > > Signed-off-by: Jonah Palmer > --- > hw/virtio/meson.build | 2 ++ > hw/virtio/virtio-stub.c| 14 ++ > hw/virtio/virtio.c | 27 +++ > include/hw/virtio/virtio.h | 1 + > qapi/meson.build | 1 + > qapi/qapi-schema.json | 1 + > qapi/virtio.json | 66 > ++ > tests/qtest/qmp-cmd-test.c | 1 + > 8 files changed, 113 insertions(+) > create mode 100644 hw/virtio/virtio-stub.c > create mode 100644 qapi/virtio.json > > [Jonah: VirtioInfo member 'type' is now of type string and no longer > relies on defining a QAPI list of virtio device type enumerations > to match the VirtIODevice name with qapi_enum_parse().] Hmm; depending on how much information you want to cram in strings, we may want to rebase this series on top of Dan's work to add the HumanReadableText QAPI type: https://lists.gnu.org/archive/html/qemu-devel/2021-09/msg07717.html > +++ b/qapi/virtio.json > @@ -0,0 +1,66 @@ > +# -*- Mode: Python -*- > +# vim: filetype=python > +# > + > +## > +# = Virtio devices > +## > + > +## > +# @VirtioInfo: > +# > +# Information about a given VirtIODevice > +# > +# @path: VirtIO device canonical QOM path. > +# > +# @type: VirtIO device name. > +# > +# Since: 6.2 > +# > +## > +{ 'struct': 'VirtioInfo', > +'data': { > +'path': 'str', > +'type': 'str' > +} > +} > + > +## > +# @x-debug-query-virtio: > +# > +# Return a list of all initalized VirtIO devices > +# > +# Returns: list of gathered @VirtioInfo devices > +# > +# Since: 6.2 > +# > +# Example: > +# > +# -> { "execute": "x-debug-query-virtio" } > +# <- { "return": [ > +#{ > +#"path": "/machine/peripheral-anon/device[4]/virtio-backend", > +#"type": "virtio-input" > +#}, > +#{ > +#"path": "/machine/peripheral/crypto0/virtio-backend", > +#"type": "virtio-crypto" > +#}, > +#{ > +#"path": "/machine/peripheral-anon/device[2]/virtio-backend", > +#"type": "virtio-scsi" > +#}, > +#{ > +#"path": "/machine/peripheral-anon/device[1]/virtio-backend", > +#"type": "virtio-net" > +#}, > +#{ > +#"path": "/machine/peripheral-anon/device[0]/virtio-backend", > +#"type": "virtio-serial" > +#} > +# ] > +#} > +# > +## > + > +{ 'command': 'x-debug-query-virtio', 'returns': ['VirtioInfo'] } But for now, it looks like 'str' is the correct type. -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3266 Virtualization: qemu.org | libvirt.org
[PATCH v7 3/8] qmp: add QMP command x-debug-query-virtio
From: Laurent Vivier This new command lists all the instances of VirtIODevice with their QOM paths and virtio type/name. Signed-off-by: Jonah Palmer --- hw/virtio/meson.build | 2 ++ hw/virtio/virtio-stub.c| 14 ++ hw/virtio/virtio.c | 27 +++ include/hw/virtio/virtio.h | 1 + qapi/meson.build | 1 + qapi/qapi-schema.json | 1 + qapi/virtio.json | 66 ++ tests/qtest/qmp-cmd-test.c | 1 + 8 files changed, 113 insertions(+) create mode 100644 hw/virtio/virtio-stub.c create mode 100644 qapi/virtio.json [Jonah: VirtioInfo member 'type' is now of type string and no longer relies on defining a QAPI list of virtio device type enumerations to match the VirtIODevice name with qapi_enum_parse().] diff --git a/hw/virtio/meson.build b/hw/virtio/meson.build index bc352a6..d409735 100644 --- a/hw/virtio/meson.build +++ b/hw/virtio/meson.build @@ -6,8 +6,10 @@ softmmu_virtio_ss.add(when: 'CONFIG_VHOST', if_false: files('vhost-stub.c')) softmmu_ss.add_all(when: 'CONFIG_VIRTIO', if_true: softmmu_virtio_ss) softmmu_ss.add(when: 'CONFIG_VIRTIO', if_false: files('vhost-stub.c')) +softmmu_ss.add(when: 'CONFIG_VIRTIO', if_false: files('virtio-stub.c')) softmmu_ss.add(when: 'CONFIG_ALL', if_true: files('vhost-stub.c')) +softmmu_ss.add(when: 'CONFIG_ALL', if_true: files('virtio-stub.c')) virtio_ss = ss.source_set() virtio_ss.add(files('virtio.c')) diff --git a/hw/virtio/virtio-stub.c b/hw/virtio/virtio-stub.c new file mode 100644 index 000..d4a88f5 --- /dev/null +++ b/hw/virtio/virtio-stub.c @@ -0,0 +1,14 @@ +#include "qemu/osdep.h" +#include "qapi/error.h" +#include "qapi/qapi-commands-virtio.h" + +static void *qmp_virtio_unsupported(Error **errp) +{ +error_setg(errp, "Virtio is disabled"); +return NULL; +} + +VirtioInfoList *qmp_x_debug_query_virtio(Error **errp) +{ +return qmp_virtio_unsupported(errp); +} diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c index 4af20c0..a454e2f 100644 --- a/hw/virtio/virtio.c +++ b/hw/virtio/virtio.c @@ -13,6 +13,8 @@ #include "qemu/osdep.h" #include "qapi/error.h" +#include "qapi/qapi-commands-virtio.h" +#include "qapi/qapi-visit-virtio.h" #include "cpu.h" #include "trace.h" #include "qemu/error-report.h" @@ -29,6 +31,9 @@ #include "sysemu/runstate.h" #include "standard-headers/linux/virtio_ids.h" +/* QAPI list of 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 @@ -3709,6 +3714,7 @@ static void virtio_device_realize(DeviceState *dev, Error **errp) vdev->listener.commit = virtio_memory_listener_commit; memory_listener_register(&vdev->listener, vdev->dma_as); +QTAILQ_INSERT_TAIL(&virtio_list, vdev, next); } static void virtio_device_unrealize(DeviceState *dev) @@ -3723,6 +3729,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; } @@ -3896,6 +3903,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) @@ -3906,6 +3915,24 @@ bool virtio_device_ioeventfd_enabled(VirtIODevice *vdev) return virtio_bus_ioeventfd_enabled(vbus); } +VirtioInfoList *qmp_x_debug_query_virtio(Error **errp) +{ +VirtioInfoList *list = NULL; +VirtioInfoList *node; +VirtIODevice *vdev; + +QTAILQ_FOREACH(vdev, &virtio_list, next) { +DeviceState *dev = DEVICE(vdev); +node = g_new0(VirtioInfoList, 1); +node->value = g_new(VirtioInfo, 1); +node->value->path = g_strdup(dev->canonical_path); +node->value->type = g_strdup(vdev->name); +QAPI_LIST_PREPEND(list, node->value); +} + +return list; +} + static const TypeInfo virtio_device_info = { .name = TYPE_VIRTIO_DEVICE, .parent = TYPE_DEVICE, diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h index 105b98c..eceaafc 100644 --- a/include/hw/virtio/virtio.h +++ b/include/hw/virtio/virtio.h @@ -110,6 +110,7 @@ struct VirtIODevice bool use_guest_notifier_mask; AddressSpace *dma_as; QLIST_HEAD(, VirtQueue) *vector_queues; +QTAILQ_ENTRY(VirtIODevice) next; }; struct VirtioDeviceClass { diff --git a/qapi/meson.build b/qapi/meson.build index c356a38..df5662e 100644 --- a/qapi/meson.build +++ b/qapi/meson.build @@ -45,6 +45,7 @@ qapi_all_modules = [ 'sockets', 'trace', 'transaction', + 'virtio', 'yank', ] if have_system diff --git a/qapi/qapi-schema.json b/qapi/qapi-schema.json index 4912b97..1512ada 100644 --- a/qapi/qap