Commit f9a8f5812607 moved protocol_features to the vhost-user backend.
As a result, VhostStatus.protocol_features is only populated for
vhost-user devices.

For an active kernel vhost device, HMP info virtio-status and QMP
x-query-virtio-status crashes now because of unset protocol-features.

Make protocol-features optional in VhostStatus and skip dumping a
missing object in HMP.

For QMP we can change the x-query-virtio-status command semantics
because it is unstable.

Enable corresponding test, it works now.

Fixes: f9a8f5812607 ("vhost: move protocol_features to vhost_user")
Co-authored-by: Nikolay Kuratov <[email protected]>
Signed-off-by: Vladimir Sementsov-Ogievskiy <[email protected]>
---
 hw/virtio/virtio-hmp-cmds.c                   | 6 ++++--
 qapi/virtio.json                              | 5 +++--
 tests/functional/x86_64/test_virtio_status.py | 1 -
 3 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/hw/virtio/virtio-hmp-cmds.c b/hw/virtio/virtio-hmp-cmds.c
index e5da6f00699..5b08a06ec42 100644
--- a/hw/virtio/virtio-hmp-cmds.c
+++ b/hw/virtio/virtio-hmp-cmds.c
@@ -176,8 +176,10 @@ void hmp_virtio_status(MonitorHMP *hmp, const QDict *qdict)
         hmp_virtio_dump_features(hmp, s->vhost_dev->features);
         monitor_hmp_printf(hmp, "    Acked features:\n");
         hmp_virtio_dump_features(hmp, s->vhost_dev->acked_features);
-        monitor_hmp_printf(hmp, "    Protocol features:\n");
-        hmp_virtio_dump_protocols(hmp, s->vhost_dev->protocol_features);
+        if (s->vhost_dev->protocol_features) {
+            monitor_hmp_printf(hmp, "    Protocol features:\n");
+            hmp_virtio_dump_protocols(hmp, s->vhost_dev->protocol_features);
+        }
     }
 
     qapi_free_VirtioStatus(s);
diff --git a/qapi/virtio.json b/qapi/virtio.json
index 1fc4e38a44d..f8e699a0e4e 100644
--- a/qapi/virtio.json
+++ b/qapi/virtio.json
@@ -85,7 +85,8 @@
 #
 # @acked-features: vhost_dev acked_features
 #
-# @protocol-features: vhost_dev protocol_features
+# @protocol-features: vhost-user protocol features.  Present only for
+#     vhost-user devices.
 #
 # @max-queues: vhost_dev max_queues
 #
@@ -104,7 +105,7 @@
             'vq-index': 'int',
             'features': 'VirtioDeviceFeatures',
             'acked-features': 'VirtioDeviceFeatures',
-            'protocol-features': 'VhostDeviceProtocols',
+            '*protocol-features': 'VhostDeviceProtocols',
             'max-queues': 'uint64',
             'backend-cap': 'uint64',
             'log-enabled': 'bool',
diff --git a/tests/functional/x86_64/test_virtio_status.py 
b/tests/functional/x86_64/test_virtio_status.py
index 1e72c713cc6..a88823004f8 100755
--- a/tests/functional/x86_64/test_virtio_status.py
+++ b/tests/functional/x86_64/test_virtio_status.py
@@ -45,7 +45,6 @@ def check_commands(self, vm):
         vm.cmd("x-query-virtio-status", path=self.VIRTIO_PATH)
 
     @skipIfMissingCommands("unshare")
-    @skipIfMissingEnv("QEMU_FAILING_TESTS")
     def test_vhost(self):
         self.require_netdev("tap")
         for device in ("/dev/net/tun", "/dev/vhost-net"):
-- 
2.43.0


Reply via email to