From: Laurent Vivier <lvivier@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Laurent Vivier" <lvivier@redhat.com>,
"Fam Zheng" <fam@euphon.net>, "Thomas Huth" <thuth@redhat.com>,
qemu-block@nongnu.org, "Amit Shah" <amit@kernel.org>,
"Markus Armbruster" <armbru@redhat.com>,
"Jason Wang" <jasowang@redhat.com>,
"Michael S. Tsirkin" <mst@redhat.com>,
"David Hildenbrand" <david@redhat.com>,
"Michael Roth" <mdroth@linux.vnet.ibm.com>,
"Max Reitz" <mreitz@redhat.com>,
"Eric Auger" <eric.auger@redhat.com>,
"Gerd Hoffmann" <kraxel@redhat.com>,
"Stefan Hajnoczi" <stefanha@redhat.com>,
"Marc-André Lureau" <marcandre.lureau@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Kevin Wolf" <kwolf@redhat.com>,
"Dr. David Alan Gilbert" <dgilbert@redhat.com>
Subject: [RFC v2 0/6] hmp,qmp: Add some commands to introspect virtio devices
Date: Mon, 20 Apr 2020 12:41:39 +0200 [thread overview]
Message-ID: <20200420104145.205297-1-lvivier@redhat.com> (raw)
This series introduces new QMP/HMP commands to dump the status
of a a virtio device at different levels.
1. Main command
HMP Only:
virtio [subcommand]
Example:
List all sub-commands:
(qemu) virtio
virtio query -- List all available virtio devices
virtio status path -- Display status of a given virtio device
virtio queue-status path queue -- Display status of a given virtio queue
virtio queue-element path queue [index] -- Display element of a given virtio queue
2. List available virtio devices in the machine
HMP Form:
virtio query
Example:
(qemu) virtio query
/machine/peripheral-anon/device[3]/virtio-backend [virtio-net]
/machine/peripheral-anon/device[1]/virtio-backend [virtio-serial]
/machine/peripheral-anon/device[0]/virtio-backend [virtio-blk]
QMP Form:
{ 'command': 'query-virtio', 'returns': ['VirtioInfo'] }
Example:
-> { "execute": "query-virtio" }
<- { "return": [
{
"path": "/machine/peripheral-anon/device[3]/virtio-backend",
"type": "virtio-net"
},
{
"path": "/machine/peripheral-anon/device[1]/virtio-backend",
"type": "virtio-serial"
},
{
"path": "/machine/peripheral-anon/device[0]/virtio-backend",
"type": "virtio-blk"
}
]
}
3. Display status of a given virtio device
HMP Form:
virtio status <path>
Example:
(qemu) virtio status /machine/peripheral-anon/device[3]/virtio-backend
/machine/peripheral-anon/device[3]/virtio-backend:
Device Id: 1
Guest features: event-idx, indirect-desc, version-1
ctrl-mac-addr, guest-announce, ctrl-vlan, ctrl-rx, ctrl-vq, status, mrg-rxbuf, host-ufo, host-ecn, host-tso6, host-tso4, guest-ufo, guest-ecn, guest-tso6, guest-tso4, mac, ctrl-guest-offloads, guest-csum, csum
Host features: event-idx, indirect-desc, bad-feature, version-1, any-layout, notify-on-empty
gso, ctrl-mac-addr, guest-announce, ctrl-rx-extra, ctrl-vlan, ctrl-rx, ctrl-vq, status, mrg-rxbuf, host-ufo, host-ecn, host-tso6, host-tso4, guest-ufo, guest-ecn, guest-tso6, guest-tso4, mac, ctrl-guest-offloads, guest-csum, csum
Backend features:
Endianness: little
VirtQueues: 3
QMP Form:
{ 'command': 'virtio-status',
'data': { 'path': 'str' },
'returns': 'VirtioStatus'
}
Example:
-> { "execute": "virtio-status",
"arguments": {
"path": "/machine/peripheral-anon/device[3]/virtio-backend"
}
}
<- { "return": {
"device-endian": "little",
"device-id": 1,
"backend-features": {
"device": {
"type": "virtio-net",
"data": []
},
"unknown": 0,
"transport": []
},
"num-vqs": 3,
"guest-features": {
"device": {
"type": "virtio-net",
"data": [ "ctrl-mac-addr", "guest-announce", "ctrl-vlan", "ctrl-rx",
"ctrl-vq", "status", "mrg-rxbuf", "host-ufo", "host-ecn",
"host-tso6", "host-tso4", "guest-ufo", "guest-ecn",
"guest-tso6", "guest-tso4", "mac", "ctrl-guest-offloads",
"guest-csum", "csum" ]
},
"unknown": 0,
"transport": [ "event-idx", "indirect-desc", "version-1" ]
},
"host-features": {
"device": {
"type": "virtio-net",
"data": [ "gso", "ctrl-mac-addr", "guest-announce", "ctrl-rx-extra",
"ctrl-vlan", "ctrl-rx", "ctrl-vq", "status", "mrg-rxbuf",
"host-ufo", "host-ecn", "host-tso6", "host-tso4",
"guest-ufo", "guest-ecn", "guest-tso6", "guest-tso4",
"mac", "ctrl-guest-offloads", "guest-csum", "csum" ]
},
"unknown": 0,
"transport": [ "event-idx", "indirect-desc", "bad-feature",
"version-1", "any-layout", "notify-on-empty" ]
}
}
}
4. Display status of a given virtio queue
HMP Form:
virtio queue-status <path> <queue>
Example:
(qemu) virtio queue-status /machine/peripheral-anon/device[3]/virtio-backend 0
/machine/peripheral-anon/device[3]/virtio-backend:
index: 0
inuse: 0
last_avail_idx: 61
shadow_avail_idx: 292
signalled_used: 61
signalled_used_valid: 1
VRing:
num: 256
num_default: 256
align: 4096
desc: 0x000000006c352000
avail: 0x000000006c353000
used: 0x000000006c353240
QMP Form:
{ 'command': 'virtio-queue-status',
'data': { 'path': 'str', 'queue': 'uint16' },
'returns': 'VirtQueueStatus'
}
Example:
-> { "execute": "virtio-queue-status",
"arguments": {
"path": "/machine/peripheral-anon/device[3]/virtio-backend",
"queue": 0
}
}
<- { "return": {
"signalled_used": 373,
"inuse": 0,
"vring_desc": 864411648,
"vring_num_default": 256,
"signalled_used_valid": 1,
"vring_avail": 864415744,
"last_avail_idx": 373,
"queue_index": 0,
"vring_used": 864416320,
"shadow_avail_idx": 619,
"used_idx": 373,
"vring_num": 256,
"vring_align": 4096
}
}
5. Display element of a given virtio queue
HMP Form:
virtio queue-element <path> <queue> [index]
Example:
Dump the information of the head element of the first queue of
the first virtio device::
(qemu) virtio queue-element/machine/peripheral-anon/device[3]/virtio-backend 0
index: 67
ndescs: 1
descs: addr 0x6fe69800 len 1536 (write)
(qemu) xp/128bx 0x6fe69800
000000006fe69800: 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x00
000000006fe69808: 0x00 0x00 0x01 0x00 0x52 0x54 0x00 0x12
000000006fe69810: 0x34 0x56 0x52 0x54 0x00 0x09 0x51 0xde
000000006fe69818: 0x08 0x00 0x45 0x00 0x00 0x4c 0x8f 0x32
device[3] is a virtio-net device and we can see in the element buffer the
MAC address of the card::
[root@localhost ~]# ip link show ens4
2: ens4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP m0
link/ether 52:54:00:12:34:56 brd ff:ff:ff:ff:ff:ff
and the MAC address of the gateway::
[root@localhost ~]# arp -a
_gateway (192.168.122.1) at 52:54:00:09:51:de [ether] on ens4
QMP Form:
{ 'command': 'virtio-queue-element',
'data': { 'path': 'str', 'queue': 'uint16', '*index': 'uint16' },
'returns': 'VirtioQueueElement'
}
Example:
-> { "execute": "virtio-queue-element",
"arguments": {
"path": "/machine/peripheral-anon/device[3]/virtio-backend",
"queue": 0
}
}
-> { "return": {
"index": 109,
"ndescs": 1,
"descs": [
{ "flags": [ "write" ], "len": 1536, "addr": 853145600 }
]
}
}
v2: introduce VirtioType enum
use an enum for the endianness
change field names to stick to naming conventions (s/_/-/)
add a patch to decode feature bits
don't check if the queue is empty to allow to displa old elements
use enum for desc flags
manage indirect desc
decode device features in the HMP command
Laurent Vivier (6):
qmp: add QMP command query-virtio
qmp: add QMP command virtio-status
qmp: decode feature bits in virtio-status
qmp: add QMP command virtio-queue-status
qmp: add QMP command virtio-queue-element
hmp: add virtio commands
Makefile | 2 +-
Makefile.target | 7 +-
docs/system/monitor.rst | 2 +
hmp-commands-virtio.hx | 160 +++++++++++
hmp-commands.hx | 10 +
hw/block/virtio-blk.c | 23 ++
hw/char/virtio-serial-bus.c | 11 +
hw/display/virtio-gpu-base.c | 10 +
hw/net/virtio-net.c | 35 +++
hw/scsi/virtio-scsi.c | 12 +
hw/virtio/Makefile.objs | 2 +
hw/virtio/virtio-balloon.c | 13 +
hw/virtio/virtio-iommu.c | 14 +
hw/virtio/virtio-stub.c | 32 +++
hw/virtio/virtio.c | 537 +++++++++++++++++++++++++++++++++++
include/hw/virtio/virtio.h | 14 +
include/monitor/hmp.h | 4 +
monitor/misc.c | 17 ++
qapi/Makefile.objs | 2 +-
qapi/qapi-schema.json | 1 +
qapi/virtio.json | 502 ++++++++++++++++++++++++++++++++
tests/qtest/qmp-cmd-test.c | 1 +
22 files changed, 1407 insertions(+), 4 deletions(-)
create mode 100644 hmp-commands-virtio.hx
create mode 100644 hw/virtio/virtio-stub.c
create mode 100644 qapi/virtio.json
--
2.25.2
next reply other threads:[~2020-04-20 10:43 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-20 10:41 Laurent Vivier [this message]
2020-04-20 10:41 ` [RFC v2 1/6] qmp: add QMP command query-virtio Laurent Vivier
2020-04-20 14:57 ` Eric Blake
2020-04-20 10:41 ` [RFC v2 2/6] qmp: add QMP command virtio-status Laurent Vivier
2020-04-20 10:41 ` [RFC v2 3/6] qmp: decode feature bits in virtio-status Laurent Vivier
2020-04-20 10:41 ` [RFC v2 4/6] qmp: add QMP command virtio-queue-status Laurent Vivier
2020-04-20 10:41 ` [RFC v2 5/6] qmp: add QMP command virtio-queue-element Laurent Vivier
2020-04-20 10:41 ` [RFC v2 6/6] hmp: add virtio commands Laurent Vivier
2020-04-20 15:05 ` [RFC v2 0/6] hmp, qmp: Add some commands to introspect virtio devices no-reply
2020-04-20 15:55 ` [RFC v2 0/6] hmp,qmp: " Kevin Wolf
2020-04-21 8:42 ` Laurent Vivier
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=20200420104145.205297-1-lvivier@redhat.com \
--to=lvivier@redhat.com \
--cc=amit@kernel.org \
--cc=armbru@redhat.com \
--cc=david@redhat.com \
--cc=dgilbert@redhat.com \
--cc=eric.auger@redhat.com \
--cc=fam@euphon.net \
--cc=jasowang@redhat.com \
--cc=kraxel@redhat.com \
--cc=kwolf@redhat.com \
--cc=marcandre.lureau@redhat.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=mreitz@redhat.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.