From: Markus Armbruster <armbru@redhat.com>
To: Hyman Huang <yong.huang@smartx.com>
Cc: qemu-devel@nongnu.org, "Michael S . Tsirkin" <mst@redhat.com>,
Eric Blake <eblake@redhat.com>, Thomas Huth <thuth@redhat.com>,
Laurent Vivier <lvivier@redhat.com>,
Paolo Bonzini <pbonzini@redhat.com>
Subject: Re: [RFC 1/2] qapi/virtio: introduce the "show-bits" argument for x-query-virtio-status
Date: Thu, 16 Nov 2023 15:44:39 +0100 [thread overview]
Message-ID: <87h6llep0o.fsf@pond.sub.org> (raw)
In-Reply-To: <2f146005c8573814528f4ffb5a0393eb73b154e3.1699793550.git.yong.huang@smartx.com> (Hyman Huang's message of "Sun, 12 Nov 2023 21:03:19 +0800")
Hyman Huang <yong.huang@smartx.com> writes:
> This patch allows to display feature and status bits in virtio-status.
>
> An optional argument is introduced: show-bits. For example:
> {"execute": "x-query-virtio-status",
> "arguments": {"path": "/machine/peripheral-anon/device[1]/virtio-backend",
> "show-bits": true}
>
> Features and status bits could be helpful for applications to compare
> directly. For instance, when an upper application aims to ensure the
> virtio negotiation correctness between guest, QEMU, and OVS-DPDK, it use
> the "ovs-vsctl list interface" command to retrieve interface features
> (in number format) and the QMP command x-query-virtio-status to retrieve
> vhost-user net device features. If "show-bits" is added, the application
> can compare the two features directly; No need to encoding the features
> returned by the QMP command.
>
> This patch also serves as a preparation for the next one, which implements
> a vhost-user test case about acked features of vhost-user protocol.
>
> Note that since the matching HMP command is typically used for human,
> leave it unchanged.
>
> Signed-off-by: Hyman Huang <yong.huang@smartx.com>
> ---
> hw/virtio/virtio-hmp-cmds.c | 2 +-
> hw/virtio/virtio-qmp.c | 21 +++++++++++++++-
> qapi/virtio.json | 49 ++++++++++++++++++++++++++++++++++---
> 3 files changed, 67 insertions(+), 5 deletions(-)
>
> diff --git a/hw/virtio/virtio-hmp-cmds.c b/hw/virtio/virtio-hmp-cmds.c
> index 477c97dea2..3774f3d4bf 100644
> --- a/hw/virtio/virtio-hmp-cmds.c
> +++ b/hw/virtio/virtio-hmp-cmds.c
> @@ -108,7 +108,7 @@ void hmp_virtio_status(Monitor *mon, const QDict *qdict)
> {
> Error *err = NULL;
> const char *path = qdict_get_try_str(qdict, "path");
> - VirtioStatus *s = qmp_x_query_virtio_status(path, &err);
> + VirtioStatus *s = qmp_x_query_virtio_status(path, false, false, &err);
>
> if (err != NULL) {
> hmp_handle_error(mon, err);
> diff --git a/hw/virtio/virtio-qmp.c b/hw/virtio/virtio-qmp.c
> index 1dd96ed20f..2e92bf28ac 100644
> --- a/hw/virtio/virtio-qmp.c
> +++ b/hw/virtio/virtio-qmp.c
> @@ -718,10 +718,15 @@ VirtIODevice *qmp_find_virtio_device(const char *path)
> return VIRTIO_DEVICE(dev);
> }
>
> -VirtioStatus *qmp_x_query_virtio_status(const char *path, Error **errp)
> +VirtioStatus *qmp_x_query_virtio_status(const char *path,
> + bool has_show_bits,
> + bool show_bits,
> + Error **errp)
> {
> VirtIODevice *vdev;
> VirtioStatus *status;
> + bool display_bits =
> + has_show_bits ? show_bits : false;
Since !has_show_bits implies !show_bits, you can simply use
if (show_bits).
>
> vdev = qmp_find_virtio_device(path);
> if (vdev == NULL) {
> @@ -733,6 +738,11 @@ VirtioStatus *qmp_x_query_virtio_status(const char *path, Error **errp)
> status->name = g_strdup(vdev->name);
> status->device_id = vdev->device_id;
> status->vhost_started = vdev->vhost_started;
> + if (display_bits) {
> + status->guest_features_bits = vdev->guest_features;
> + status->host_features_bits = vdev->host_features;
> + status->backend_features_bits = vdev->backend_features;
> + }
> status->guest_features = qmp_decode_features(vdev->device_id,
> vdev->guest_features);
> status->host_features = qmp_decode_features(vdev->device_id,
> @@ -753,6 +763,9 @@ VirtioStatus *qmp_x_query_virtio_status(const char *path, Error **errp)
> }
>
> status->num_vqs = virtio_get_num_queues(vdev);
> + if (display_bits) {
> + status->status_bits = vdev->status;
> + }
> status->status = qmp_decode_status(vdev->status);
> status->isr = vdev->isr;
> status->queue_sel = vdev->queue_sel;
> @@ -775,6 +788,12 @@ VirtioStatus *qmp_x_query_virtio_status(const char *path, Error **errp)
> status->vhost_dev->n_tmp_sections = hdev->n_tmp_sections;
> status->vhost_dev->nvqs = hdev->nvqs;
> status->vhost_dev->vq_index = hdev->vq_index;
> + if (display_bits) {
> + status->vhost_dev->features_bits = hdev->features;
> + status->vhost_dev->acked_features_bits = hdev->acked_features;
> + status->vhost_dev->backend_features_bits = hdev->backend_features;
> + status->vhost_dev->protocol_features_bits = hdev->protocol_features;
> + }
> status->vhost_dev->features =
> qmp_decode_features(vdev->device_id, hdev->features);
> status->vhost_dev->acked_features =
> diff --git a/qapi/virtio.json b/qapi/virtio.json
> index e6dcee7b83..608b841a89 100644
> --- a/qapi/virtio.json
> +++ b/qapi/virtio.json
> @@ -79,12 +79,20 @@
> #
> # @vq-index: vhost_dev vq_index
> #
> +# @features-bits: vhost_dev features in decimal format
Say "encoded as a number". The number is decimal just because the
transport is JSON. We could have another transport some day. Or
language bindings wrapping around the JSON transport.
> +#
> # @features: vhost_dev features
Double-checking... @feature-bits provides the exact same information as
@features, only in another encoding. Correct?
Same for all the other new -bits. Correct?
> #
> +# @acked-features-bits: vhost_dev acked_features in decimal format
> +#
> # @acked-features: vhost_dev acked_features
> #
> +# @backend-features-bits: vhost_dev backend_features in decimal format
> +#
> # @backend-features: vhost_dev backend_features
> #
> +# @protocol-features-bits: vhost_dev protocol_features in decimal format
> +#
> # @protocol-features: vhost_dev protocol_features
> #
> # @max-queues: vhost_dev max_queues
> @@ -102,9 +110,13 @@
> 'n-tmp-sections': 'int',
> 'nvqs': 'uint32',
> 'vq-index': 'int',
> + 'features-bits': 'uint64',
> 'features': 'VirtioDeviceFeatures',
> + 'acked-features-bits': 'uint64',
> 'acked-features': 'VirtioDeviceFeatures',
> + 'backend-features-bits': 'uint64',
> 'backend-features': 'VirtioDeviceFeatures',
> + 'protocol-features-bits': 'uint64',
> 'protocol-features': 'VhostDeviceProtocols',
> 'max-queues': 'uint64',
> 'backend-cap': 'uint64',
> @@ -124,10 +136,16 @@
> #
> # @vhost-started: VirtIODevice vhost_started flag
> #
> +# @guest-features-bits: VirtIODevice guest_features in decimal format
> +#
> # @guest-features: VirtIODevice guest_features
> #
> +# @host-features-bits: VirtIODevice host_features in decimal format
> +#
> # @host-features: VirtIODevice host_features
> #
> +# @backend-features-bits: VirtIODevice backend_features in decimal format
> +#
> # @backend-features: VirtIODevice backend_features
> #
> # @device-endian: VirtIODevice device_endian
> @@ -135,6 +153,9 @@
> # @num-vqs: VirtIODevice virtqueue count. This is the number of
> # active virtqueues being used by the VirtIODevice.
> #
> +# @status-bits: VirtIODevice configuration status in decimal format
> +# (VirtioDeviceStatus)
> +#
> # @status: VirtIODevice configuration status (VirtioDeviceStatus)
> #
> # @isr: VirtIODevice ISR
> @@ -170,10 +191,14 @@
> 'device-id': 'uint16',
> 'vhost-started': 'bool',
> 'device-endian': 'str',
> + 'guest-features-bits': 'uint64',
> 'guest-features': 'VirtioDeviceFeatures',
> + 'host-features-bits': 'uint64',
> 'host-features': 'VirtioDeviceFeatures',
> + 'backend-features-bits': 'uint64',
> 'backend-features': 'VirtioDeviceFeatures',
> 'num-vqs': 'int',
> + 'status-bits': 'uint8',
> 'status': 'VirtioDeviceStatus',
> 'isr': 'uint8',
> 'queue-sel': 'uint16',
> @@ -195,6 +220,9 @@
> #
> # @path: Canonical QOM path of the VirtIODevice
> #
> +# @show-bits: Whether to display the feature & status bits.
> +# Default is disabled. (Since 8.2)
This makes the new members opt-in. Why not include them always?
> +#
> # Features:
> #
> # @unstable: This command is meant for debugging.
> @@ -208,7 +236,8 @@
> # 1. Poll for the status of virtio-crypto (no vhost-crypto active)
> #
> # -> { "execute": "x-query-virtio-status",
> -# "arguments": { "path": "/machine/peripheral/crypto0/virtio-backend" }
> +# "arguments": { "path": "/machine/peripheral/crypto0/virtio-backend",
> +# "show-bits": true }
> # }
> # <- { "return": {
> # "device-endian": "little",
> @@ -216,6 +245,7 @@
> # "disable-legacy-check": false,
> # "name": "virtio-crypto",
> # "started": true,
> +# "guest-features-bits": 5100273664,
> # "device-id": 20,
> # "backend-features": {
> # "transports": [],
> @@ -241,6 +271,7 @@
> # "VIRTIO_F_VERSION_1: Device compliant for v1 spec (legacy)"
> # ]
> # },
> +# "host-features-bits": 6325010432,
> # "host-features": {
> # "unknown-dev-features": 1073741824,
> # "dev-features": [],
> @@ -252,9 +283,11 @@
> # "VIRTIO_F_NOTIFY_ON_EMPTY: Notify when device runs out of avail. descs. on VQ"
> # ]
> # },
> +# "backend-features-bits": 0,
> # "use-guest-notifier-mask": true,
> # "vm-running": true,
> # "queue-sel": 1,
> +# "status-bits": 15,
> # "disabled": false,
> # "vhost-started": false,
> # "use-started": true
> @@ -264,7 +297,8 @@
> # 2. Poll for the status of virtio-net (vhost-net is active)
> #
> # -> { "execute": "x-query-virtio-status",
> -# "arguments": { "path": "/machine/peripheral-anon/device[1]/virtio-backend" }
> +# "arguments": { "path": "/machine/peripheral-anon/device[1]/virtio-backend",
> +# "show-bits": true }
> # }
> # <- { "return": {
> # "device-endian": "little",
> @@ -272,11 +306,13 @@
> # "disabled-legacy-check": false,
> # "name": "virtio-net",
> # "started": true,
> +# "guest-features-bits": 5111807911,
> # "device-id": 1,
> # "vhost-dev": {
> # "n-tmp-sections": 4,
> # "n-mem-sections": 4,
> # "max-queues": 1,
> +# "features-bits": 13908344832
> # "backend-cap": 2,
> # "log-size": 0,
> # "backend-features": {
> @@ -284,6 +320,8 @@
> # "transports": []
> # },
> # "nvqs": 2,
> +# "acked-features-bits": 5100306432,
> +# "backend-features-bits": 0,
> # "protocol-features": {
> # "protocols": []
> # },
> @@ -299,6 +337,7 @@
> # "VIRTIO_F_VERSION_1: Device compliant for v1 spec (legacy)"
> # ]
> # },
> +# "protocol-features-bits": 0,
> # "features": {
> # "dev-features": [
> # "VHOST_F_LOG_ALL: Logging write descriptors supported",
> @@ -387,6 +426,7 @@
> # "VIRTIO_F_VERSION_1: Device compliant for v1 spec (legacy)"
> # ]
> # },
> +# "host-features-bits": 6337593319,
> # "host-features": {
> # "dev-features": [
> # "VHOST_USER_F_PROTOCOL_FEATURES: Vhost-user protocol features negotiation supported",
> @@ -420,9 +460,11 @@
> # "VIRTIO_F_NOTIFY_ON_EMPTY: Notify when device runs out of avail. descs. on VQ"
> # ]
> # },
> +# "backend-features-bits": 6337593319,
> # "use-guest-notifier-mask": true,
> # "vm-running": true,
> # "queue-sel": 2,
> +# "status-bits": 15,
> # "disabled": false,
> # "vhost-started": true,
> # "use-started": true
> @@ -430,7 +472,8 @@
> # }
> ##
> { 'command': 'x-query-virtio-status',
> - 'data': { 'path': 'str' },
> + 'data': { 'path': 'str',
> + '*show-bits': 'bool'},
> 'returns': 'VirtioStatus',
> 'features': [ 'unstable' ] }
next prev parent reply other threads:[~2023-11-16 14:45 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-12 13:03 [RFC 0/2] vhost-user-test: Add negotiated features check Hyman Huang
2023-11-12 13:03 ` [RFC 1/2] qapi/virtio: introduce the "show-bits" argument for x-query-virtio-status Hyman Huang
2023-11-16 14:44 ` Markus Armbruster [this message]
2023-11-17 16:12 ` Yong Huang
2023-11-21 7:58 ` Markus Armbruster
2023-11-21 10:02 ` Yong Huang
2023-12-01 10:41 ` Laurent Vivier
2023-12-01 15:21 ` Markus Armbruster
2023-12-01 15:37 ` Laurent Vivier
2023-12-06 7:35 ` Markus Armbruster
2023-12-09 5:03 ` Yong Huang
2023-11-12 13:03 ` [RFC 2/2] vhost-user-test: Add negotiated features check Hyman Huang
2023-11-16 1:01 ` [RFC 0/2] " Yong Huang
2023-11-17 10:29 ` Michael S. Tsirkin
2023-11-17 16:26 ` Yong Huang
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=87h6llep0o.fsf@pond.sub.org \
--to=armbru@redhat.com \
--cc=eblake@redhat.com \
--cc=lvivier@redhat.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=thuth@redhat.com \
--cc=yong.huang@smartx.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.