[PATCH v11 0/8] hmp,qmp: Add commands to introspect virtio devices

Jonah Palmer posted 8 patches 2 years, 3 months ago
Test checkpatch passed
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/1642678168-20447-1-git-send-email-jonah.palmer@oracle.com
Maintainers: Amit Shah <amit@kernel.org>, Paolo Bonzini <pbonzini@redhat.com>, Greg Kurz <groug@kaod.org>, Hanna Reitz <hreitz@redhat.com>, Mathieu Poirier <mathieu.poirier@linaro.org>, Fam Zheng <fam@euphon.net>, Thomas Huth <thuth@redhat.com>, Raphael Norwitz <raphael.norwitz@nutanix.com>, Kevin Wolf <kwolf@redhat.com>, Stefan Hajnoczi <stefanha@redhat.com>, "Dr. David Alan Gilbert" <dgilbert@redhat.com>, David Hildenbrand <david@redhat.com>, Laurent Vivier <lvivier@redhat.com>, "Gonglei (Arei)" <arei.gonglei@huawei.com>, Christian Schoenebeck <qemu_oss@crudebyte.com>, Markus Armbruster <armbru@redhat.com>, "Michael S. Tsirkin" <mst@redhat.com>, Eric Blake <eblake@redhat.com>, Jason Wang <jasowang@redhat.com>, Michael Roth <michael.roth@amd.com>, "Marc-André Lureau" <marcandre.lureau@redhat.com>, Gerd Hoffmann <kraxel@redhat.com>, Eric Auger <eric.auger@redhat.com>
There is a newer version of this series
hmp-commands-info.hx                   |  70 +++
hw/9pfs/virtio-9p-device.c             |   2 +-
hw/block/vhost-user-blk.c              |   9 +-
hw/block/virtio-blk.c                  |  31 +-
hw/char/virtio-serial-bus.c            |  14 +-
hw/display/vhost-user-gpu.c            |   7 +
hw/display/virtio-gpu-base.c           |  20 +-
hw/input/vhost-user-input.c            |   7 +
hw/input/virtio-input.c                |  13 +-
hw/net/virtio-net.c                    |  58 ++-
hw/scsi/vhost-scsi.c                   |   8 +
hw/scsi/virtio-scsi.c                  |  20 +-
hw/virtio/meson.build                  |   2 +
hw/virtio/vhost-user-fs.c              |  20 +-
hw/virtio/vhost-user-i2c.c             |   7 +-
hw/virtio/vhost-user-rng.c             |   9 +-
hw/virtio/vhost-user-vsock.c           |   2 +-
hw/virtio/vhost-vsock-common.c         |  22 +-
hw/virtio/vhost-vsock.c                |   2 +-
hw/virtio/vhost.c                      |   4 +-
hw/virtio/virtio-balloon.c             |  17 +-
hw/virtio/virtio-crypto.c              |  22 +-
hw/virtio/virtio-iommu.c               |  17 +-
hw/virtio/virtio-mem.c                 |  14 +-
hw/virtio/virtio-pmem.c                |   3 +-
hw/virtio/virtio-rng.c                 |   2 +-
hw/virtio/virtio-stub.c                |  42 ++
hw/virtio/virtio.c                     | 742 ++++++++++++++++++++++++++++-
include/hw/virtio/vhost-vsock-common.h |   2 +-
include/hw/virtio/vhost.h              |   3 +
include/hw/virtio/virtio-gpu.h         |   3 +-
include/hw/virtio/virtio.h             |  26 +-
include/monitor/hmp.h                  |   5 +
monitor/hmp-cmds.c                     | 311 ++++++++++++
qapi/meson.build                       |   1 +
qapi/qapi-schema.json                  |   1 +
qapi/virtio.json                       | 841 +++++++++++++++++++++++++++++++++
tests/qtest/qmp-cmd-test.c             |   1 +
38 files changed, 2335 insertions(+), 45 deletions(-)
create mode 100644 hw/virtio/virtio-stub.c
create mode 100644 qapi/virtio.json
[PATCH v11 0/8] hmp,qmp: Add commands to introspect virtio devices
Posted by Jonah Palmer 2 years, 3 months ago
This series introduces new QMP/HMP commands to dump the status of a
virtio device at different levels.

[Jonah: Rebasing from previous patchset from Dec. 9 (v10). Original patches
 are by Laurnet Vivier from May 2020.

 Rebase from v10 to v11 mainly includes a check when querying or gathering
 any information about a virtio device. This check queries the QOM composition
 tree to make sure that the device (a) exists and (b) is realized before
 attempting to get any more information from it. This is done to get some
 kind of synchronicity between @virtio_list and the QOM composition tree.]

1. List available virtio devices in the machine

HMP Form:

    info virtio

    Example:

        (qemu) info virtio
        /machine/peripheral/vsock0/virtio-backend [vhost-vsock]
        /machine/peripheral/crypto0/virtio-backend [virtio-crypto]
        /machine/peripheral-anon/device[2]/virtio-backend [virtio-scsi]
        /machine/peripheral-anon/device[1]/virtio-backend [virtio-net]
        /machine/peripheral-anon/device[0]/virtio-backend [virtio-serial]

QMP Form:

    { 'command': 'x-query-virtio',
      'returns': ['VirtioInfo'],
      'features': [ 'unstable' ] }

    Example:

        -> { "execute": "x-query-virtio" }
        <- { "return": [
               {
                   "path": "/machine/peripheral/vsock0/virtio-backend",
                   "name": "vhost-vsock"
               },
               {
                   "path": "/machine/peripheral/crypto0/virtio-backend",
                   "name": "virtio-crypto"
               },
               {
                   "path": "/machine/peripheral-anon/device[2]/virtio-backend",
                   "name": "virtio-scsi"
               },
               {
                   "path": "/machine/peripheral-anon/device[1]/virtio-backend",
                   "name": "virtio-net"
               },
               {
                   "path": "/machine/peripheral-anon/device[0]/virtio-backend",
                   "name": "virtio-serial"
               }
             ]
           }

2. Display status of a given virtio device

HMP Form:

    info virtio-status <path>

    Example:

        (qemu) info virtio-status /machine/peripheral/vsock0/virtio-backend
        /machine/peripheral/vsock0/virtio-backend:
            device_name:             vhost-vsock (vhost)
            device_id:               19
            vhost_started:           true
            bus_name:                (null)
            broken:                  false
            disabled:                false
            disable_legacy_check:    false
            started:                 true
            use_started:             true
            start_on_kick:           false
            use_guest_notifier_mask: true
            vm_running:              true
            num_vqs:                 3
            queue_sel:               2
            isr:                     0
            endianness:              little
            status: ACKNOWLEDGE, DRIVER, FEATURES_OK, DRIVER_OK
            Guest features:   EVENT_IDX, INDIRECT_DESC, VERSION_1
            Host features:    PROTOCOL_FEATURES, EVENT_IDX, INDIRECT_DESC, VERSION_1, ANY_LAYOUT,
                              NOTIFY_ON_EMPTY
            Backend features:
            VHost:
                nvqs:           2
                vq_index:       0
                max_queues:     0
                n_mem_sections: 4
                n_tmp_sections: 4
                backend_cap:    0
                log_enabled:    false
                log_size:       0
                Features:          EVENT_IDX, INDIRECT_DESC, VERSION_1, ANY_LAYOUT, NOTIFY_ON_EMPTY
                                   LOG_ALL
                Acked features:    EVENT_IDX, INDIRECT_DESC, VERSION_1
                Backend features:
                Protocol features:

QMP Form:

    { 'command': 'x-query-virtio-status',
      'data': { 'path': 'str' },
      'returns': 'VirtioStatus',
      'features': [ 'unstable' ] }

    Example:

        -> { "execute": "x-query-virtio-status",
             "arguments": { "path": "/machine/peripheral/vsock0/virtio-backend" }
           }
        <- { "return": {
                   "device-endian": "little",
                   "bus-name": "",
                   "disable-legacy-check": false,
                   "name": "vhost-vsock",
                   "started": true,
                   "device-id": 19,
                   "vhost-dev": {
                      "n-tmp-sections": 4,
                      "n-mem-sections": 4,
                      "max-queues": 0,
                      "backend-cap": 0,
                      "log-size": 0,
                      "backend-features": {
                         "transports": [],
                         "dev-features": []
                      },
                      "nvqs": 2,
                      "protocol-features": {
                         "protocols": []
                      },
                      "vq-index": 0,
                      "log-enabled": false,
                      "acked-features": {
                         "transports": ["EVENT_IDX", "INDIRECT_DESC", "VERSION_1"],
                         "dev-features": []
                      },
                      "features": {
                         "transports": ["EVENT_IDX", "INDIRECT_DESC", "VERSION_1", "ANY_LAYOUT",
                                        "NOTIFY_ON_EMPTY"],
                         "dev-features": ["LOG_ALL"]
                      }
                   },
                   "backend-features": {
                      "transports": [],
                      "dev-features": []
                   },
                   "start-on-kick": false,
                   "isr": 0,
                   "broken": false,
                   "status": {
                      "statuses": ["ACKNOWLEDGE", "DRIVER", "FEATURES_OK", "DRIVER_OK"]
                   },
                   "num-vqs": 3,
                   "guest-features": {
                      "transports": ["EVENT_IDX", "INDIRECT_DESC", "VERSION_1"],
                      "dev-features": []
                   },
                   "host-features": {
                      "transports": ["PROTOCOL_FEATURES", "EVENT_IDX", "INDIRECT_DESC", "VERSION_1",
                                     "ANY_LAYOUT", "NOTIFY_ON_EMPTY"],
                      "dev-features": []
                   },
                   "use-guest-notifier-mask": true,
                   "vm-running": true,
                   "queue-sel": 2,
                   "disabled": false,
                   "vhost-started": true,
                   "use-started": true
             }
           }


3. Display status of a given virtio queue

HMP Form:

    info virtio-queue-status <path> <queue>

    Example:

        (qemu) info virtio-queue-status /machine/peripheral-anon/device[1]/virtio-backend 2
        /machine/peripheral-anon/device[1]/virtio-backend:
            device_name:          virtio-net
            queue_index:          2
            inuse:                0
            used_idx:             27
            signalled_used:       27
            signalled_used_valid: true
            VRing:
                num:          64
                num_default:  64
                align:        4096
                desc:         0x00000001342b5000
                avail:        0x00000001342b5400
                used:         0x00000001342b54c0

QMP Form:

    { 'command': 'x-query-virtio-queue-status',
      'data': { 'path': 'str', 'queue': 'uint16' },
      'returns': 'VirtQueueStatus',
      'features': [ 'unstable' ] }

    Example:

        -> { "execute": "x-query-virtio-queue-status",
             "arguments": { "path": "/machine/peripheral-anon/device[1]/virtio-backend",
                            "queue": 2 }
           }
        <- { "return": {
                   "signalled-used": 27,
                   "inuse": 0,
                   "vring-align": 4096,
                   "vring-desc": 5170221056,
                   "signalled-used-valid": true,
                   "vring-num-default": 64,
                   "vring-avail": 5170222080,
                   "queue-index": 2,
                   "vring-used": 5170222272,
                   "used-idx": 27,
                   "name": "virtio-net",
                   "vring-num": 64 }
           }

4. Display status of a given vhost queue

HMP Form:

    info virtio-vhost-queue-status <path> <queue>

    Example:

        (qemu) info virtio-vhost-queue-status /machine/peripheral-anon/device[1]/virtio-backend 1
        /machine/peripheral-anon/device[1]/virtio-backend:
            device_name:          virtio-net (vhost)
            kick:                 0
            call:                 0
            VRing:
                num:         256
                desc:        0x00007f31c032c000
                desc_phys:   0x00000001340c6000
                desc_size:   4096
                avail:       0x00007f31c032d000
                avail_phys:  0x00000001340c7000
                avail_size:  518
                used:        0x00007f31c032d240
                used_phys:   0x00000001340c7240
                used_size:   2054

QMP Form:

    { 'command': 'x-query-virtio-vhost-queue-status',
      'data': { 'path': 'str', 'queue': 'uint16' },
      'returns': 'VirtVhostQueueStatus',
      'features': [ 'unstable' ] }

    Example:

        -> { "execute": "x-query-virtio-vhost-queue-status",
             "arguments": { "path": "/machine/peripheral-anon/device[1]/virtio-backend",
                            "queue": 1 }
           }
        <- { "return": {
                   "avail-phys": 5168197632,
                   "used-phys": 5168198208,
                   "avail-size": 518,
                   "desc-size": 4096,
                   "used-size": 2054,
                   "desc": 139851654676480,
                   "num": 256,
                   "name": "virtio-net",
                   "call": 0,
                   "avail": 139851654680576,
                   "desc-phys": 5168193536,
                   "used": 139851654681152,
                   "kick": 0 }
           }

5. Display an element of a given virtio queue

HMP Form:

    info virtio-queue-element <path> <queue> [index]

    Example:

        Dump the information of the head element of the third queue of virtio-scsi:

        (qemu) info virtio-queue-element /machine/peripheral-anon/device[2]/virtio-backend 2
        /machine/peripheral-anon/device[2]/virtio-backend:
            device_name: virtio-scsi
            index:       125
            desc:
               descs:   addr 0xa4f90f1d0653b5fc len 1862028160 (used, avail, next)
            avail:
               flags: 0
               idx:   2936
               ring:  125
            used:
               flags: 0
               idx:   2936

QMP Form:

    { 'command': 'x-query-virtio-queue-element',
      'data': { 'path': 'str', 'queue': 'uint16', '*index': 'uint16' },
      'returns': 'VirtioQueueElement',
      'features': [ 'unstable' ] }

    Example:

        -> { "execute": "x-query-virtio-queue-element",
             "arguments": { "path": "/machine/peripheral-anon/device[2]/virtio-backend",
                            "queue": 2 }
           }
        <- { "return": {
                   "index": 125,
                   "name": "virtio-scsi",
                   "descs": [
                      { "flags": ["used", "avail", "next"],
                        "len": 1862028160,
                        "addr": 11887549308755752444 }
                   ],
                   "avail": {
                      "idx": 2936,
                      "flags": 0,
                      "ring": 125
                   },
                   "used": {
                      "idx": 2936,
                      "flags": 0
                   }
             }
           }

v11: minor reformatting in virtio.json
     added synchronicity check when querying virtio devices

v10: rebased for upstream (Qemu 7.0)
     reformat virtio.json for better consistency
     removed all enums from virtio.json; replaced with string literals
     removed @ndescs from VirtioQueueElement
     removed examples in hmp-commands-info.hx (to fix 'inconsistent
     literal block quoting' error from Sphinx)

v9: rebased for upstream (Qemu 6.3)
    change QMP command prefixes from 'x-debug-virtio' to
    'x-query-virtio'
    add 'unstable' feature to all 'x-query-virtio' prefixed
    QMP commands
    fix odd indentation for qapi/virtio.json
    device features support for virtio-mem
    move HMP sub-commands under 'virtio' top level to 'info'
    top level

v8: add assert in virtio_id_to_name() to make sure we're
    not returning NULL
    minor documentation additions to qapi/virtio.json
    add virtio introspection support for vhost-user-rng

v7: rebased for upstream (Qemu 6.2)
    add ability to map between numberic device ID and
    string device ID (name) for virtio devices
    add get_vhost() callback function for VirtIODevices
    expose more fields of VirtIODevice
    expose fields of vhost devices
    decode vhost user protocol features
    decode VirtIODevice configuration statuses
    vhost support for displaying virtio queue statuses
    vhost support for displaying vhost queue statuses
    expose driver and device areas when introspecting a
    virtio queue element
    changed patch attribution

v6: rebased for upstream (Qemu 6.1)
    add all virtio/vhost types in same order as
    include/standard-headers/linux/virtio_ids.h
    use QAPI_LIST_PREPEND in qmp_x_debug_query_virtio rather than open
    coding

v5: rebased for upstream
    add device name, used index, and relative indicies to virtio queue-status
    HMP command
    add device name to virtio queue-status QMP command
    add new virtio device features

v4: re-send series as v3 didn't reach qemu-devel

v3: use qapi_free_VirtioInfoList() on the head of the list, not on the tail.
    Prefix the QMP commands with 'x-debug-'

v2: introduce VirtioType enum
    use an enum for the endianness
    change field names to stick to naming convertions (s/_/-/)
    add a patch to decode feature bits
    don't check if the queue is empty to allow display of old elements
    use enum for desc flags
    manage indirect desc
    decode device features in the HMP command

Jonah Palmer (2):
  virtio: drop name parameter for virtio_init()
  virtio: add vhost support for virtio devices

Laurent Vivier (6):
  qmp: add QMP command x-query-virtio
  qmp: add QMP command x-query-virtio-status
  qmp: decode feature & status bits in virtio-status
  qmp: add QMP commands for virtio/vhost queue-status
  qmp: add QMP command x-query-virtio-queue-element
  hmp: add virtio commands

 hmp-commands-info.hx                   |  70 +++
 hw/9pfs/virtio-9p-device.c             |   2 +-
 hw/block/vhost-user-blk.c              |   9 +-
 hw/block/virtio-blk.c                  |  31 +-
 hw/char/virtio-serial-bus.c            |  14 +-
 hw/display/vhost-user-gpu.c            |   7 +
 hw/display/virtio-gpu-base.c           |  20 +-
 hw/input/vhost-user-input.c            |   7 +
 hw/input/virtio-input.c                |  13 +-
 hw/net/virtio-net.c                    |  58 ++-
 hw/scsi/vhost-scsi.c                   |   8 +
 hw/scsi/virtio-scsi.c                  |  20 +-
 hw/virtio/meson.build                  |   2 +
 hw/virtio/vhost-user-fs.c              |  20 +-
 hw/virtio/vhost-user-i2c.c             |   7 +-
 hw/virtio/vhost-user-rng.c             |   9 +-
 hw/virtio/vhost-user-vsock.c           |   2 +-
 hw/virtio/vhost-vsock-common.c         |  22 +-
 hw/virtio/vhost-vsock.c                |   2 +-
 hw/virtio/vhost.c                      |   4 +-
 hw/virtio/virtio-balloon.c             |  17 +-
 hw/virtio/virtio-crypto.c              |  22 +-
 hw/virtio/virtio-iommu.c               |  17 +-
 hw/virtio/virtio-mem.c                 |  14 +-
 hw/virtio/virtio-pmem.c                |   3 +-
 hw/virtio/virtio-rng.c                 |   2 +-
 hw/virtio/virtio-stub.c                |  42 ++
 hw/virtio/virtio.c                     | 742 ++++++++++++++++++++++++++++-
 include/hw/virtio/vhost-vsock-common.h |   2 +-
 include/hw/virtio/vhost.h              |   3 +
 include/hw/virtio/virtio-gpu.h         |   3 +-
 include/hw/virtio/virtio.h             |  26 +-
 include/monitor/hmp.h                  |   5 +
 monitor/hmp-cmds.c                     | 311 ++++++++++++
 qapi/meson.build                       |   1 +
 qapi/qapi-schema.json                  |   1 +
 qapi/virtio.json                       | 841 +++++++++++++++++++++++++++++++++
 tests/qtest/qmp-cmd-test.c             |   1 +
 38 files changed, 2335 insertions(+), 45 deletions(-)
 create mode 100644 hw/virtio/virtio-stub.c
 create mode 100644 qapi/virtio.json

-- 
1.8.3.1


Re: [PATCH v11 0/8] hmp,qmp: Add commands to introspect virtio devices
Posted by Michael S. Tsirkin 2 years, 2 months ago
On Thu, Jan 20, 2022 at 06:29:20AM -0500, Jonah Palmer wrote:
> This series introduces new QMP/HMP commands to dump the status of a
> virtio device at different levels.

I dropped this patchset due to various build failures.
Pls take a look at Peter's comments on the pull request
to see some of these.

> [Jonah: Rebasing from previous patchset from Dec. 9 (v10). Original patches
>  are by Laurnet Vivier from May 2020.
> 
>  Rebase from v10 to v11 mainly includes a check when querying or gathering
>  any information about a virtio device. This check queries the QOM composition
>  tree to make sure that the device (a) exists and (b) is realized before
>  attempting to get any more information from it. This is done to get some
>  kind of synchronicity between @virtio_list and the QOM composition tree.]
> 
> 1. List available virtio devices in the machine
> 
> HMP Form:
> 
>     info virtio
> 
>     Example:
> 
>         (qemu) info virtio
>         /machine/peripheral/vsock0/virtio-backend [vhost-vsock]
>         /machine/peripheral/crypto0/virtio-backend [virtio-crypto]
>         /machine/peripheral-anon/device[2]/virtio-backend [virtio-scsi]
>         /machine/peripheral-anon/device[1]/virtio-backend [virtio-net]
>         /machine/peripheral-anon/device[0]/virtio-backend [virtio-serial]
> 
> QMP Form:
> 
>     { 'command': 'x-query-virtio',
>       'returns': ['VirtioInfo'],
>       'features': [ 'unstable' ] }
> 
>     Example:
> 
>         -> { "execute": "x-query-virtio" }
>         <- { "return": [
>                {
>                    "path": "/machine/peripheral/vsock0/virtio-backend",
>                    "name": "vhost-vsock"
>                },
>                {
>                    "path": "/machine/peripheral/crypto0/virtio-backend",
>                    "name": "virtio-crypto"
>                },
>                {
>                    "path": "/machine/peripheral-anon/device[2]/virtio-backend",
>                    "name": "virtio-scsi"
>                },
>                {
>                    "path": "/machine/peripheral-anon/device[1]/virtio-backend",
>                    "name": "virtio-net"
>                },
>                {
>                    "path": "/machine/peripheral-anon/device[0]/virtio-backend",
>                    "name": "virtio-serial"
>                }
>              ]
>            }
> 
> 2. Display status of a given virtio device
> 
> HMP Form:
> 
>     info virtio-status <path>
> 
>     Example:
> 
>         (qemu) info virtio-status /machine/peripheral/vsock0/virtio-backend
>         /machine/peripheral/vsock0/virtio-backend:
>             device_name:             vhost-vsock (vhost)
>             device_id:               19
>             vhost_started:           true
>             bus_name:                (null)
>             broken:                  false
>             disabled:                false
>             disable_legacy_check:    false
>             started:                 true
>             use_started:             true
>             start_on_kick:           false
>             use_guest_notifier_mask: true
>             vm_running:              true
>             num_vqs:                 3
>             queue_sel:               2
>             isr:                     0
>             endianness:              little
>             status: ACKNOWLEDGE, DRIVER, FEATURES_OK, DRIVER_OK
>             Guest features:   EVENT_IDX, INDIRECT_DESC, VERSION_1
>             Host features:    PROTOCOL_FEATURES, EVENT_IDX, INDIRECT_DESC, VERSION_1, ANY_LAYOUT,
>                               NOTIFY_ON_EMPTY
>             Backend features:
>             VHost:
>                 nvqs:           2
>                 vq_index:       0
>                 max_queues:     0
>                 n_mem_sections: 4
>                 n_tmp_sections: 4
>                 backend_cap:    0
>                 log_enabled:    false
>                 log_size:       0
>                 Features:          EVENT_IDX, INDIRECT_DESC, VERSION_1, ANY_LAYOUT, NOTIFY_ON_EMPTY
>                                    LOG_ALL
>                 Acked features:    EVENT_IDX, INDIRECT_DESC, VERSION_1
>                 Backend features:
>                 Protocol features:
> 
> QMP Form:
> 
>     { 'command': 'x-query-virtio-status',
>       'data': { 'path': 'str' },
>       'returns': 'VirtioStatus',
>       'features': [ 'unstable' ] }
> 
>     Example:
> 
>         -> { "execute": "x-query-virtio-status",
>              "arguments": { "path": "/machine/peripheral/vsock0/virtio-backend" }
>            }
>         <- { "return": {
>                    "device-endian": "little",
>                    "bus-name": "",
>                    "disable-legacy-check": false,
>                    "name": "vhost-vsock",
>                    "started": true,
>                    "device-id": 19,
>                    "vhost-dev": {
>                       "n-tmp-sections": 4,
>                       "n-mem-sections": 4,
>                       "max-queues": 0,
>                       "backend-cap": 0,
>                       "log-size": 0,
>                       "backend-features": {
>                          "transports": [],
>                          "dev-features": []
>                       },
>                       "nvqs": 2,
>                       "protocol-features": {
>                          "protocols": []
>                       },
>                       "vq-index": 0,
>                       "log-enabled": false,
>                       "acked-features": {
>                          "transports": ["EVENT_IDX", "INDIRECT_DESC", "VERSION_1"],
>                          "dev-features": []
>                       },
>                       "features": {
>                          "transports": ["EVENT_IDX", "INDIRECT_DESC", "VERSION_1", "ANY_LAYOUT",
>                                         "NOTIFY_ON_EMPTY"],
>                          "dev-features": ["LOG_ALL"]
>                       }
>                    },
>                    "backend-features": {
>                       "transports": [],
>                       "dev-features": []
>                    },
>                    "start-on-kick": false,
>                    "isr": 0,
>                    "broken": false,
>                    "status": {
>                       "statuses": ["ACKNOWLEDGE", "DRIVER", "FEATURES_OK", "DRIVER_OK"]
>                    },
>                    "num-vqs": 3,
>                    "guest-features": {
>                       "transports": ["EVENT_IDX", "INDIRECT_DESC", "VERSION_1"],
>                       "dev-features": []
>                    },
>                    "host-features": {
>                       "transports": ["PROTOCOL_FEATURES", "EVENT_IDX", "INDIRECT_DESC", "VERSION_1",
>                                      "ANY_LAYOUT", "NOTIFY_ON_EMPTY"],
>                       "dev-features": []
>                    },
>                    "use-guest-notifier-mask": true,
>                    "vm-running": true,
>                    "queue-sel": 2,
>                    "disabled": false,
>                    "vhost-started": true,
>                    "use-started": true
>              }
>            }
> 
> 
> 3. Display status of a given virtio queue
> 
> HMP Form:
> 
>     info virtio-queue-status <path> <queue>
> 
>     Example:
> 
>         (qemu) info virtio-queue-status /machine/peripheral-anon/device[1]/virtio-backend 2
>         /machine/peripheral-anon/device[1]/virtio-backend:
>             device_name:          virtio-net
>             queue_index:          2
>             inuse:                0
>             used_idx:             27
>             signalled_used:       27
>             signalled_used_valid: true
>             VRing:
>                 num:          64
>                 num_default:  64
>                 align:        4096
>                 desc:         0x00000001342b5000
>                 avail:        0x00000001342b5400
>                 used:         0x00000001342b54c0
> 
> QMP Form:
> 
>     { 'command': 'x-query-virtio-queue-status',
>       'data': { 'path': 'str', 'queue': 'uint16' },
>       'returns': 'VirtQueueStatus',
>       'features': [ 'unstable' ] }
> 
>     Example:
> 
>         -> { "execute": "x-query-virtio-queue-status",
>              "arguments": { "path": "/machine/peripheral-anon/device[1]/virtio-backend",
>                             "queue": 2 }
>            }
>         <- { "return": {
>                    "signalled-used": 27,
>                    "inuse": 0,
>                    "vring-align": 4096,
>                    "vring-desc": 5170221056,
>                    "signalled-used-valid": true,
>                    "vring-num-default": 64,
>                    "vring-avail": 5170222080,
>                    "queue-index": 2,
>                    "vring-used": 5170222272,
>                    "used-idx": 27,
>                    "name": "virtio-net",
>                    "vring-num": 64 }
>            }
> 
> 4. Display status of a given vhost queue
> 
> HMP Form:
> 
>     info virtio-vhost-queue-status <path> <queue>
> 
>     Example:
> 
>         (qemu) info virtio-vhost-queue-status /machine/peripheral-anon/device[1]/virtio-backend 1
>         /machine/peripheral-anon/device[1]/virtio-backend:
>             device_name:          virtio-net (vhost)
>             kick:                 0
>             call:                 0
>             VRing:
>                 num:         256
>                 desc:        0x00007f31c032c000
>                 desc_phys:   0x00000001340c6000
>                 desc_size:   4096
>                 avail:       0x00007f31c032d000
>                 avail_phys:  0x00000001340c7000
>                 avail_size:  518
>                 used:        0x00007f31c032d240
>                 used_phys:   0x00000001340c7240
>                 used_size:   2054
> 
> QMP Form:
> 
>     { 'command': 'x-query-virtio-vhost-queue-status',
>       'data': { 'path': 'str', 'queue': 'uint16' },
>       'returns': 'VirtVhostQueueStatus',
>       'features': [ 'unstable' ] }
> 
>     Example:
> 
>         -> { "execute": "x-query-virtio-vhost-queue-status",
>              "arguments": { "path": "/machine/peripheral-anon/device[1]/virtio-backend",
>                             "queue": 1 }
>            }
>         <- { "return": {
>                    "avail-phys": 5168197632,
>                    "used-phys": 5168198208,
>                    "avail-size": 518,
>                    "desc-size": 4096,
>                    "used-size": 2054,
>                    "desc": 139851654676480,
>                    "num": 256,
>                    "name": "virtio-net",
>                    "call": 0,
>                    "avail": 139851654680576,
>                    "desc-phys": 5168193536,
>                    "used": 139851654681152,
>                    "kick": 0 }
>            }
> 
> 5. Display an element of a given virtio queue
> 
> HMP Form:
> 
>     info virtio-queue-element <path> <queue> [index]
> 
>     Example:
> 
>         Dump the information of the head element of the third queue of virtio-scsi:
> 
>         (qemu) info virtio-queue-element /machine/peripheral-anon/device[2]/virtio-backend 2
>         /machine/peripheral-anon/device[2]/virtio-backend:
>             device_name: virtio-scsi
>             index:       125
>             desc:
>                descs:   addr 0xa4f90f1d0653b5fc len 1862028160 (used, avail, next)
>             avail:
>                flags: 0
>                idx:   2936
>                ring:  125
>             used:
>                flags: 0
>                idx:   2936
> 
> QMP Form:
> 
>     { 'command': 'x-query-virtio-queue-element',
>       'data': { 'path': 'str', 'queue': 'uint16', '*index': 'uint16' },
>       'returns': 'VirtioQueueElement',
>       'features': [ 'unstable' ] }
> 
>     Example:
> 
>         -> { "execute": "x-query-virtio-queue-element",
>              "arguments": { "path": "/machine/peripheral-anon/device[2]/virtio-backend",
>                             "queue": 2 }
>            }
>         <- { "return": {
>                    "index": 125,
>                    "name": "virtio-scsi",
>                    "descs": [
>                       { "flags": ["used", "avail", "next"],
>                         "len": 1862028160,
>                         "addr": 11887549308755752444 }
>                    ],
>                    "avail": {
>                       "idx": 2936,
>                       "flags": 0,
>                       "ring": 125
>                    },
>                    "used": {
>                       "idx": 2936,
>                       "flags": 0
>                    }
>              }
>            }
> 
> v11: minor reformatting in virtio.json
>      added synchronicity check when querying virtio devices
> 
> v10: rebased for upstream (Qemu 7.0)
>      reformat virtio.json for better consistency
>      removed all enums from virtio.json; replaced with string literals
>      removed @ndescs from VirtioQueueElement
>      removed examples in hmp-commands-info.hx (to fix 'inconsistent
>      literal block quoting' error from Sphinx)
> 
> v9: rebased for upstream (Qemu 6.3)
>     change QMP command prefixes from 'x-debug-virtio' to
>     'x-query-virtio'
>     add 'unstable' feature to all 'x-query-virtio' prefixed
>     QMP commands
>     fix odd indentation for qapi/virtio.json
>     device features support for virtio-mem
>     move HMP sub-commands under 'virtio' top level to 'info'
>     top level
> 
> v8: add assert in virtio_id_to_name() to make sure we're
>     not returning NULL
>     minor documentation additions to qapi/virtio.json
>     add virtio introspection support for vhost-user-rng
> 
> v7: rebased for upstream (Qemu 6.2)
>     add ability to map between numberic device ID and
>     string device ID (name) for virtio devices
>     add get_vhost() callback function for VirtIODevices
>     expose more fields of VirtIODevice
>     expose fields of vhost devices
>     decode vhost user protocol features
>     decode VirtIODevice configuration statuses
>     vhost support for displaying virtio queue statuses
>     vhost support for displaying vhost queue statuses
>     expose driver and device areas when introspecting a
>     virtio queue element
>     changed patch attribution
> 
> v6: rebased for upstream (Qemu 6.1)
>     add all virtio/vhost types in same order as
>     include/standard-headers/linux/virtio_ids.h
>     use QAPI_LIST_PREPEND in qmp_x_debug_query_virtio rather than open
>     coding
> 
> v5: rebased for upstream
>     add device name, used index, and relative indicies to virtio queue-status
>     HMP command
>     add device name to virtio queue-status QMP command
>     add new virtio device features
> 
> v4: re-send series as v3 didn't reach qemu-devel
> 
> v3: use qapi_free_VirtioInfoList() on the head of the list, not on the tail.
>     Prefix the QMP commands with 'x-debug-'
> 
> v2: introduce VirtioType enum
>     use an enum for the endianness
>     change field names to stick to naming convertions (s/_/-/)
>     add a patch to decode feature bits
>     don't check if the queue is empty to allow display of old elements
>     use enum for desc flags
>     manage indirect desc
>     decode device features in the HMP command
> 
> Jonah Palmer (2):
>   virtio: drop name parameter for virtio_init()
>   virtio: add vhost support for virtio devices
> 
> Laurent Vivier (6):
>   qmp: add QMP command x-query-virtio
>   qmp: add QMP command x-query-virtio-status
>   qmp: decode feature & status bits in virtio-status
>   qmp: add QMP commands for virtio/vhost queue-status
>   qmp: add QMP command x-query-virtio-queue-element
>   hmp: add virtio commands
> 
>  hmp-commands-info.hx                   |  70 +++
>  hw/9pfs/virtio-9p-device.c             |   2 +-
>  hw/block/vhost-user-blk.c              |   9 +-
>  hw/block/virtio-blk.c                  |  31 +-
>  hw/char/virtio-serial-bus.c            |  14 +-
>  hw/display/vhost-user-gpu.c            |   7 +
>  hw/display/virtio-gpu-base.c           |  20 +-
>  hw/input/vhost-user-input.c            |   7 +
>  hw/input/virtio-input.c                |  13 +-
>  hw/net/virtio-net.c                    |  58 ++-
>  hw/scsi/vhost-scsi.c                   |   8 +
>  hw/scsi/virtio-scsi.c                  |  20 +-
>  hw/virtio/meson.build                  |   2 +
>  hw/virtio/vhost-user-fs.c              |  20 +-
>  hw/virtio/vhost-user-i2c.c             |   7 +-
>  hw/virtio/vhost-user-rng.c             |   9 +-
>  hw/virtio/vhost-user-vsock.c           |   2 +-
>  hw/virtio/vhost-vsock-common.c         |  22 +-
>  hw/virtio/vhost-vsock.c                |   2 +-
>  hw/virtio/vhost.c                      |   4 +-
>  hw/virtio/virtio-balloon.c             |  17 +-
>  hw/virtio/virtio-crypto.c              |  22 +-
>  hw/virtio/virtio-iommu.c               |  17 +-
>  hw/virtio/virtio-mem.c                 |  14 +-
>  hw/virtio/virtio-pmem.c                |   3 +-
>  hw/virtio/virtio-rng.c                 |   2 +-
>  hw/virtio/virtio-stub.c                |  42 ++
>  hw/virtio/virtio.c                     | 742 ++++++++++++++++++++++++++++-
>  include/hw/virtio/vhost-vsock-common.h |   2 +-
>  include/hw/virtio/vhost.h              |   3 +
>  include/hw/virtio/virtio-gpu.h         |   3 +-
>  include/hw/virtio/virtio.h             |  26 +-
>  include/monitor/hmp.h                  |   5 +
>  monitor/hmp-cmds.c                     | 311 ++++++++++++
>  qapi/meson.build                       |   1 +
>  qapi/qapi-schema.json                  |   1 +
>  qapi/virtio.json                       | 841 +++++++++++++++++++++++++++++++++
>  tests/qtest/qmp-cmd-test.c             |   1 +
>  38 files changed, 2335 insertions(+), 45 deletions(-)
>  create mode 100644 hw/virtio/virtio-stub.c
>  create mode 100644 qapi/virtio.json
> 
> -- 
> 1.8.3.1