[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 01/11] qdev/qbus: add hidden device support
From: |
Cornelia Huck |
Subject: |
Re: [PATCH 01/11] qdev/qbus: add hidden device support |
Date: |
Mon, 21 Oct 2019 14:44:08 +0200 |
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?
> + 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.
(...)
With the rc thing changed,
Reviewed-by: Cornelia Huck <address@hidden>
[PATCH 03/11] pci: mark devices partially unplugged, Jens Freimann, 2019/10/18