qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 01/11] qdev/qbus: add hidden device support


From: Jens Freimann
Subject: Re: [PATCH 01/11] qdev/qbus: add hidden device support
Date: Mon, 21 Oct 2019 14:52:02 +0200
User-agent: NeoMutt/20180716-1376-5d6ed1

On Mon, Oct 21, 2019 at 02:44:08PM +0200, Cornelia Huck wrote:
On Fri, 18 Oct 2019 22:20:30 +0200
Jens Freimann <address@hidden> wrote:

This adds support for hiding a device to the qbus and qdev APIs.  The
first user of this will be the virtio-net failover feature but the API
introduced with this patch could be used to implement other features as
well, for example hiding pci devices when a pci bus is powered off.

qdev_device_add() is modified to check for a net_failover_pair_id
argument in the option string. A DeviceListener callback
should_be_hidden() is added. It can be used by a standby device to
inform qdev that this device should not be added now. The standby device
handler can store the device options to plug the device in at a later
point in time.

One reason for hiding the device is that we don't want to expose both
devices to the guest kernel until the respective virtio feature bit
VIRTIO_NET_F_STANDBY was negotiated and we know that the devices will be
handled correctly by the guest.

More information on the kernel feature this is using:
 https://www.kernel.org/doc/html/latest/networking/net_failover.html

An example where the primary device is a vfio-pci device and the standby
device is a virtio-net device:

A device is hidden when it has an "net_failover_pair_id" option, e.g.

 -device virtio-net-pci,...,failover=on,...
 -device vfio-pci,...,net_failover_pair_id=net1,...

Signed-off-by: Jens Freimann <address@hidden>
---
 hw/core/qdev.c         | 23 +++++++++++++++++++++++
 include/hw/qdev-core.h |  8 ++++++++
 qdev-monitor.c         | 36 +++++++++++++++++++++++++++++++++---
 vl.c                   |  6 ++++--
 4 files changed, 68 insertions(+), 5 deletions(-)

diff --git a/hw/core/qdev.c b/hw/core/qdev.c
index cbad6c1d55..89c134ec53 100644
--- a/hw/core/qdev.c
+++ b/hw/core/qdev.c
@@ -212,6 +212,29 @@ void device_listener_unregister(DeviceListener *listener)
     QTAILQ_REMOVE(&device_listeners, listener, link);
 }

+bool qdev_should_hide_device(QemuOpts *opts)
+{
+    int rc;

Initialize to 0?

Yes, that's what the test bot found as well. Fixed it already. Though I initialize to -1, otherwise all devices will be hidden.

+    DeviceListener *listener;
+
+    QTAILQ_FOREACH(listener, &device_listeners, link) {
+       if (listener->should_be_hidden) {
+            /* should_be_hidden_will return
+             *  1 if device matches opts and it should be hidden
+             *  0 if device matches opts and should not be hidden
+             *  -1 if device doesn't match ops
+             */
+            rc = listener->should_be_hidden(listener, opts);
+        }
+
+        if (rc > 0) {
+            break;
+        }
+    }
+
+    return rc > 0;
+}
+
 void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
                                  int required_for_version)
 {

(...)

+static bool should_hide_device(QemuOpts *opts)
+{
+    if (qemu_opt_foreach(opts, is_failover_device, opts, NULL) == 0) {
+        return false;
+    }
+    return true;
+}

I still think you should turn the check around to make it easier to
extend in the future, but this is fine as well.

Sorry, I've gone back and forth on this and ended up with the same.
I'll take another look at it.
(...)

With the rc thing changed,

Reviewed-by: Cornelia Huck <address@hidden>

Thanks!

regards,
Jens



reply via email to

[Prev in Thread] Current Thread [Next in Thread]