From: Cornelia Huck <cohuck@redhat.com>
To: Venu Busireddy <venu.busireddy@oracle.com>
Cc: "Michael S. Tsirkin" <mst@redhat.com>,
Marcel Apfelbaum <marcel@redhat.com>,
virtio-dev@lists.oasis-open.org, qemu-devel@nongnu.org
Subject: Re: [virtio-dev] [PATCH v3 2/5] virtio_net: Add support for "Data Path Switching" during Live Migration.
Date: Wed, 9 Jan 2019 14:39:44 +0100 [thread overview]
Message-ID: <20190109143944.14b2f98b.cohuck@redhat.com> (raw)
In-Reply-To: <1546900184-27403-3-git-send-email-venu.busireddy@oracle.com>
On Mon, 7 Jan 2019 17:29:41 -0500
Venu Busireddy <venu.busireddy@oracle.com> wrote:
> Added a new event, FAILOVER_STANDBY_CHANGED, which is emitted whenever
> the status of the virtio_net driver in the guest changes (either the
> guest successfully loads the driver after the F_STANDBY feature bit
> is negotiated, or the guest unloads the driver or reboots). Management
> stack can use this event to determine when to plug/unplug the VF device
> to/from the guest.
>
> Also, the Virtual Functions will be automatically removed from the guest
> if the guest is rebooted. To properly identify the VFIO devices that
> must be removed, a new property named "failover-primary" is added to
> the vfio-pci devices. Only the vfio-pci devices that have this property
> enabled are removed from the guest upon reboot.
>
> Signed-off-by: Venu Busireddy <venu.busireddy@oracle.com>
> ---
> hw/acpi/pcihp.c | 27 +++++++++++++++++++++++++++
> hw/net/virtio-net.c | 24 ++++++++++++++++++++++++
> hw/vfio/pci.c | 3 +++
> hw/vfio/pci.h | 1 +
> include/hw/pci/pci.h | 1 +
> qapi/net.json | 28 ++++++++++++++++++++++++++++
> 6 files changed, 84 insertions(+)
>
> diff --git a/hw/acpi/pcihp.c b/hw/acpi/pcihp.c
> index 80d42e1..2a3ffd3 100644
> --- a/hw/acpi/pcihp.c
> +++ b/hw/acpi/pcihp.c
> @@ -176,6 +176,25 @@ static void acpi_pcihp_eject_slot(AcpiPciHpState *s, unsigned bsel, unsigned slo
> }
> }
>
> +static void acpi_pcihp_cleanup_failover_primary(AcpiPciHpState *s, int bsel)
> +{
> + BusChild *kid, *next;
> + PCIBus *bus = acpi_pcihp_find_hotplug_bus(s, bsel);
> +
> + if (!bus) {
> + return;
> + }
> + QTAILQ_FOREACH_SAFE(kid, &bus->qbus.children, sibling, next) {
> + DeviceState *qdev = kid->child;
> + PCIDevice *pdev = PCI_DEVICE(qdev);
> + int slot = PCI_SLOT(pdev->devfn);
> +
> + if (pdev->failover_primary) {
> + s->acpi_pcihp_pci_status[bsel].down |= (1U << slot);
> + }
> + }
> +}
> +
> static void acpi_pcihp_update_hotplug_bus(AcpiPciHpState *s, int bsel)
> {
> BusChild *kid, *next;
> @@ -207,6 +226,14 @@ static void acpi_pcihp_update(AcpiPciHpState *s)
> int i;
>
> for (i = 0; i < ACPI_PCIHP_MAX_HOTPLUG_BUS; ++i) {
> + /*
> + * Set the acpi_pcihp_pci_status[].down bits of all the
> + * failover_primary devices so that the devices are ejected
> + * from the guest. We can't use the qdev_unplug() as well as the
> + * hotplug_handler to unplug the devices, because the guest may
> + * not be in a state to cooperate.
> + */
> + acpi_pcihp_cleanup_failover_primary(s, i);
> acpi_pcihp_update_hotplug_bus(s, i);
> }
> }
It seems that you rely on acpi to get the processing right. On a
non-acpi system, you won't get the required changes done. Maybe only
advertise the failover feature if you are actually on a system that
supports handling of the primary correctly (which, at least currently,
means a system with acpi)?
> diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
> index 411f8fb..7b1bcde 100644
> --- a/hw/net/virtio-net.c
> +++ b/hw/net/virtio-net.c
> @@ -248,6 +248,29 @@ static void virtio_net_drop_tx_queue_data(VirtIODevice *vdev, VirtQueue *vq)
> }
> }
>
> +static void virtio_net_failover_notify_event(VirtIONet *n, uint8_t status)
> +{
> + VirtIODevice *vdev = VIRTIO_DEVICE(n);
> +
> + if (virtio_has_feature(vdev->guest_features, VIRTIO_NET_F_STANDBY)) {
> + const char *ncn = n->netclient_name;
> + gchar *path = object_get_canonical_path(OBJECT(n->qdev));
> + /*
> + * Emit FAILOVER_STANDBY_CHANGED event with enabled=true
> + * when the status transitions from 0 to VIRTIO_CONFIG_S_DRIVER_OK
> + * Emit FAILOVER_STANDBY_CHANGED event with enabled=false
> + * when the status transitions from VIRTIO_CONFIG_S_DRIVER_OK to 0
> + */
> + if ((status & VIRTIO_CONFIG_S_DRIVER_OK) &&
> + (!(vdev->status & VIRTIO_CONFIG_S_DRIVER_OK))) {
> + qapi_event_send_failover_standby_changed(!!ncn, ncn, path, true);
> + } else if ((!(status & VIRTIO_CONFIG_S_DRIVER_OK)) &&
> + (vdev->status & VIRTIO_CONFIG_S_DRIVER_OK)) {
> + qapi_event_send_failover_standby_changed(!!ncn, ncn, path, false);
> + }
Do you also need a notification if something goes wrong in the guest
and it sets VIRTIO_CONFIG_S_FAILED?
> + }
> +}
> +
> static void virtio_net_set_status(struct VirtIODevice *vdev, uint8_t status)
> {
> VirtIONet *n = VIRTIO_NET(vdev);
---------------------------------------------------------------------
To unsubscribe, e-mail: virtio-dev-unsubscribe@lists.oasis-open.org
For additional commands, e-mail: virtio-dev-help@lists.oasis-open.org
WARNING: multiple messages have this Message-ID (diff)
From: Cornelia Huck <cohuck@redhat.com>
To: Venu Busireddy <venu.busireddy@oracle.com>
Cc: "Michael S. Tsirkin" <mst@redhat.com>,
Marcel Apfelbaum <marcel@redhat.com>,
virtio-dev@lists.oasis-open.org, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [virtio-dev] [PATCH v3 2/5] virtio_net: Add support for "Data Path Switching" during Live Migration.
Date: Wed, 9 Jan 2019 14:39:44 +0100 [thread overview]
Message-ID: <20190109143944.14b2f98b.cohuck@redhat.com> (raw)
In-Reply-To: <1546900184-27403-3-git-send-email-venu.busireddy@oracle.com>
On Mon, 7 Jan 2019 17:29:41 -0500
Venu Busireddy <venu.busireddy@oracle.com> wrote:
> Added a new event, FAILOVER_STANDBY_CHANGED, which is emitted whenever
> the status of the virtio_net driver in the guest changes (either the
> guest successfully loads the driver after the F_STANDBY feature bit
> is negotiated, or the guest unloads the driver or reboots). Management
> stack can use this event to determine when to plug/unplug the VF device
> to/from the guest.
>
> Also, the Virtual Functions will be automatically removed from the guest
> if the guest is rebooted. To properly identify the VFIO devices that
> must be removed, a new property named "failover-primary" is added to
> the vfio-pci devices. Only the vfio-pci devices that have this property
> enabled are removed from the guest upon reboot.
>
> Signed-off-by: Venu Busireddy <venu.busireddy@oracle.com>
> ---
> hw/acpi/pcihp.c | 27 +++++++++++++++++++++++++++
> hw/net/virtio-net.c | 24 ++++++++++++++++++++++++
> hw/vfio/pci.c | 3 +++
> hw/vfio/pci.h | 1 +
> include/hw/pci/pci.h | 1 +
> qapi/net.json | 28 ++++++++++++++++++++++++++++
> 6 files changed, 84 insertions(+)
>
> diff --git a/hw/acpi/pcihp.c b/hw/acpi/pcihp.c
> index 80d42e1..2a3ffd3 100644
> --- a/hw/acpi/pcihp.c
> +++ b/hw/acpi/pcihp.c
> @@ -176,6 +176,25 @@ static void acpi_pcihp_eject_slot(AcpiPciHpState *s, unsigned bsel, unsigned slo
> }
> }
>
> +static void acpi_pcihp_cleanup_failover_primary(AcpiPciHpState *s, int bsel)
> +{
> + BusChild *kid, *next;
> + PCIBus *bus = acpi_pcihp_find_hotplug_bus(s, bsel);
> +
> + if (!bus) {
> + return;
> + }
> + QTAILQ_FOREACH_SAFE(kid, &bus->qbus.children, sibling, next) {
> + DeviceState *qdev = kid->child;
> + PCIDevice *pdev = PCI_DEVICE(qdev);
> + int slot = PCI_SLOT(pdev->devfn);
> +
> + if (pdev->failover_primary) {
> + s->acpi_pcihp_pci_status[bsel].down |= (1U << slot);
> + }
> + }
> +}
> +
> static void acpi_pcihp_update_hotplug_bus(AcpiPciHpState *s, int bsel)
> {
> BusChild *kid, *next;
> @@ -207,6 +226,14 @@ static void acpi_pcihp_update(AcpiPciHpState *s)
> int i;
>
> for (i = 0; i < ACPI_PCIHP_MAX_HOTPLUG_BUS; ++i) {
> + /*
> + * Set the acpi_pcihp_pci_status[].down bits of all the
> + * failover_primary devices so that the devices are ejected
> + * from the guest. We can't use the qdev_unplug() as well as the
> + * hotplug_handler to unplug the devices, because the guest may
> + * not be in a state to cooperate.
> + */
> + acpi_pcihp_cleanup_failover_primary(s, i);
> acpi_pcihp_update_hotplug_bus(s, i);
> }
> }
It seems that you rely on acpi to get the processing right. On a
non-acpi system, you won't get the required changes done. Maybe only
advertise the failover feature if you are actually on a system that
supports handling of the primary correctly (which, at least currently,
means a system with acpi)?
> diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
> index 411f8fb..7b1bcde 100644
> --- a/hw/net/virtio-net.c
> +++ b/hw/net/virtio-net.c
> @@ -248,6 +248,29 @@ static void virtio_net_drop_tx_queue_data(VirtIODevice *vdev, VirtQueue *vq)
> }
> }
>
> +static void virtio_net_failover_notify_event(VirtIONet *n, uint8_t status)
> +{
> + VirtIODevice *vdev = VIRTIO_DEVICE(n);
> +
> + if (virtio_has_feature(vdev->guest_features, VIRTIO_NET_F_STANDBY)) {
> + const char *ncn = n->netclient_name;
> + gchar *path = object_get_canonical_path(OBJECT(n->qdev));
> + /*
> + * Emit FAILOVER_STANDBY_CHANGED event with enabled=true
> + * when the status transitions from 0 to VIRTIO_CONFIG_S_DRIVER_OK
> + * Emit FAILOVER_STANDBY_CHANGED event with enabled=false
> + * when the status transitions from VIRTIO_CONFIG_S_DRIVER_OK to 0
> + */
> + if ((status & VIRTIO_CONFIG_S_DRIVER_OK) &&
> + (!(vdev->status & VIRTIO_CONFIG_S_DRIVER_OK))) {
> + qapi_event_send_failover_standby_changed(!!ncn, ncn, path, true);
> + } else if ((!(status & VIRTIO_CONFIG_S_DRIVER_OK)) &&
> + (vdev->status & VIRTIO_CONFIG_S_DRIVER_OK)) {
> + qapi_event_send_failover_standby_changed(!!ncn, ncn, path, false);
> + }
Do you also need a notification if something goes wrong in the guest
and it sets VIRTIO_CONFIG_S_FAILED?
> + }
> +}
> +
> static void virtio_net_set_status(struct VirtIODevice *vdev, uint8_t status)
> {
> VirtIONet *n = VIRTIO_NET(vdev);
next prev parent reply other threads:[~2019-01-09 13:39 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-01-07 22:29 [virtio-dev] [PATCH v3 0/5] Support for datapath switching during live migration Venu Busireddy
2019-01-07 22:29 ` [Qemu-devel] " Venu Busireddy
2019-01-07 22:29 ` [virtio-dev] [PATCH v3 1/5] virtio_net: Add VIRTIO_NET_F_STANDBY feature bit Venu Busireddy
2019-01-07 22:29 ` [Qemu-devel] " Venu Busireddy
2019-01-08 16:56 ` Dongli Zhang
2019-01-08 17:25 ` [virtio-dev] " Venu Busireddy
2019-01-08 17:25 ` Venu Busireddy
2019-01-09 0:14 ` Dongli Zhang
2019-01-09 0:18 ` [virtio-dev] " Samudrala, Sridhar
2019-01-09 0:18 ` Samudrala, Sridhar
2019-01-09 0:39 ` Dongli Zhang
2019-01-09 4:17 ` [virtio-dev] " Michael S. Tsirkin
2019-01-09 4:17 ` Michael S. Tsirkin
2019-01-07 22:29 ` [virtio-dev] [PATCH v3 2/5] virtio_net: Add support for "Data Path Switching" during Live Migration Venu Busireddy
2019-01-07 22:29 ` [Qemu-devel] " Venu Busireddy
2019-01-09 13:39 ` Cornelia Huck [this message]
2019-01-09 13:39 ` [Qemu-devel] [virtio-dev] " Cornelia Huck
2019-01-09 15:56 ` [virtio-dev] " Michael S. Tsirkin
2019-01-09 15:56 ` [Qemu-devel] " Michael S. Tsirkin
2019-01-11 2:09 ` [virtio-dev] " si-wei liu
2019-01-11 2:09 ` si-wei liu
2019-01-11 3:20 ` [virtio-dev] " Michael S. Tsirkin
2019-01-11 3:20 ` Michael S. Tsirkin
2019-01-11 7:09 ` [virtio-dev] " si-wei liu
2019-01-11 7:09 ` [Qemu-devel] [virtio-dev] " si-wei liu
2019-01-14 11:10 ` Roman Kagan
2019-01-07 22:29 ` [virtio-dev] [PATCH v3 3/5] virtio_net: Add a query command for FAILOVER_STANDBY_CHANGED event Venu Busireddy
2019-01-07 22:29 ` [Qemu-devel] " Venu Busireddy
2019-01-08 0:10 ` [virtio-dev] " Michael S. Tsirkin
2019-01-08 0:10 ` [Qemu-devel] " Michael S. Tsirkin
2019-01-07 22:29 ` [virtio-dev] [PATCH v3 4/5] vfio-pci: Add FAILOVER_PRIMARY_CHANGED event to shorten downtime during failover Venu Busireddy
2019-01-07 22:29 ` [Qemu-devel] " Venu Busireddy
2019-01-07 23:17 ` Alex Williamson
2019-01-07 23:22 ` [virtio-dev] " Michael S. Tsirkin
2019-01-07 23:22 ` Michael S. Tsirkin
2019-01-07 23:41 ` Alex Williamson
2019-01-08 0:12 ` [virtio-dev] " Michael S. Tsirkin
2019-01-08 0:12 ` Michael S. Tsirkin
2019-01-08 0:24 ` Alex Williamson
2019-01-08 0:43 ` [virtio-dev] " Michael S. Tsirkin
2019-01-08 0:43 ` Michael S. Tsirkin
2019-01-08 1:13 ` [virtio-dev] " si-wei liu
2019-01-08 1:13 ` si-wei liu
2019-01-07 22:29 ` [virtio-dev] [PATCH v3 5/5] pci: query command extension to check the bus master enabling status of the failover-primary device Venu Busireddy
2019-01-07 22:29 ` [Qemu-devel] " Venu Busireddy
2019-01-07 23:32 ` [virtio-dev] Re: [PATCH v3 0/5] Support for datapath switching during live migration Michael S. Tsirkin
2019-01-07 23:32 ` [Qemu-devel] " Michael S. Tsirkin
2019-01-08 1:45 ` [virtio-dev] " si-wei liu
2019-01-08 1:45 ` [Qemu-devel] " si-wei liu
2019-01-08 2:25 ` Michael S. Tsirkin
2019-01-08 2:25 ` [Qemu-devel] " Michael S. Tsirkin
2019-01-09 4:55 ` si-wei liu
2019-01-09 4:55 ` [Qemu-devel] " si-wei liu
2019-01-09 13:39 ` Michael S. Tsirkin
2019-01-09 13:39 ` [Qemu-devel] " Michael S. Tsirkin
2019-01-11 6:57 ` si-wei liu
2019-01-11 6:57 ` [Qemu-devel] " si-wei liu
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=20190109143944.14b2f98b.cohuck@redhat.com \
--to=cohuck@redhat.com \
--cc=marcel@redhat.com \
--cc=mst@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=venu.busireddy@oracle.com \
--cc=virtio-dev@lists.oasis-open.org \
/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.