From: Greg Kurz <gkurz@linux.vnet.ibm.com>
To: "Michael S. Tsirkin" <mst@redhat.com>
Cc: qemu-ppc@nongnu.org, qemu-devel@nongnu.org,
Anthony Liguori <aliguori@amazon.com>,
Alexander Graf <agraf@suse.de>
Subject: Re: [Qemu-devel] [PATCH v3] virtio-pci: fix migration for pci bus master
Date: Mon, 20 Oct 2014 16:15:32 +0200 [thread overview]
Message-ID: <20141020161532.7703e6f3@bahia.local> (raw)
In-Reply-To: <1413788223-16235-1-git-send-email-mst@redhat.com>
On Mon, 20 Oct 2014 09:58:50 +0300
"Michael S. Tsirkin" <mst@redhat.com> wrote:
> Current support for bus master (clearing OK bit) together with the need to
> support guests which do not enable PCI bus mastering, leads to extra state in
> VIRTIO_PCI_FLAG_BUS_MASTER_BUG bit, which isn't robust in case of cross-version
> migration for the case when guests use the device before setting DRIVER_OK.
>
> Rip out this code, and replace it:
> - Modern QEMU doesn't need VIRTIO_PCI_FLAG_BUS_MASTER_BUG
> so just drop it for latest machine type.
> - For compat machine types, set PCI_COMMAND if DRIVER_OK
> is set.
>
> As this is needed for 2.1 for both pc and ppc, move PC_COMPAT macros from pc.h
> to a new common header.
>
> Reviewed-by: Greg Kurz <gkurz@linux.vnet.ibm.com>
> Tested-by: Greg Kurz <gkurz@linux.vnet.ibm.com>
> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> ---
>
> Alexander, could you pls ack me merging this?
> Thanks!
>
This patch conflicts with the following commit in Alex's ppc-next branch:
commit 6dd65a940532eaac42a302c30964b0d42967e187
Author: David Gibson <david@gibson.dropbear.id.au>
Date: Mon Sep 8 15:30:31 2014 +1000
spapr: Cleanup machine naming conventions, and prepare for 2.2 release
Easy to fix though.
Alex,
I can send the rebased version if you want.
Cheers.
--
Greg
>
> changes from v2:
> drop default = -1 from ppc - was a typo, reported by Greg
>
> hw/virtio/virtio-pci.h | 5 +++++
> include/hw/compat.h | 16 ++++++++++++++++
> include/hw/i386/pc.h | 10 ++--------
> hw/i386/pc_piix.c | 2 +-
> hw/i386/pc_q35.c | 2 +-
> hw/ppc/spapr.c | 7 +++++++
> hw/virtio/virtio-pci.c | 29 +++++++++++------------------
> 7 files changed, 43 insertions(+), 28 deletions(-)
> create mode 100644 include/hw/compat.h
>
> diff --git a/hw/virtio/virtio-pci.h b/hw/virtio/virtio-pci.h
> index 1cea157..8873b6d 100644
> --- a/hw/virtio/virtio-pci.h
> +++ b/hw/virtio/virtio-pci.h
> @@ -53,6 +53,11 @@ typedef struct VirtioBusClass VirtioPCIBusClass;
> #define VIRTIO_PCI_BUS_CLASS(klass) \
> OBJECT_CLASS_CHECK(VirtioPCIBusClass, klass, TYPE_VIRTIO_PCI_BUS)
>
> +/* Need to activate work-arounds for buggy guests at vmstate load. */
> +#define VIRTIO_PCI_FLAG_BUS_MASTER_BUG_MIGRATION_BIT 0
> +#define VIRTIO_PCI_FLAG_BUS_MASTER_BUG_MIGRATION \
> + (1 << VIRTIO_PCI_FLAG_BUS_MASTER_BUG_MIGRATION_BIT)
> +
> /* Performance improves when virtqueue kick processing is decoupled from the
> * vcpu thread using ioeventfd for some devices. */
> #define VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT 1
> diff --git a/include/hw/compat.h b/include/hw/compat.h
> new file mode 100644
> index 0000000..47f6ff5
> --- /dev/null
> +++ b/include/hw/compat.h
> @@ -0,0 +1,16 @@
> +#ifndef HW_COMPAT_H
> +#define HW_COMPAT_H
> +
> +#define HW_COMPAT_2_1 \
> + {\
> + .driver = "intel-hda",\
> + .property = "old_msi_addr",\
> + .value = "on",\
> + },\
> + {\
> + .driver = "virtio-pci",\
> + .property = "virtio-pci-bus-master-bug-migration",\
> + .value = "on",\
> + }
> +
> +#endif /* HW_COMPAT_H */
> diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
> index bae023a..82ad046 100644
> --- a/include/hw/i386/pc.h
> +++ b/include/hw/i386/pc.h
> @@ -14,6 +14,7 @@
> #include "sysemu/sysemu.h"
> #include "hw/pci/pci.h"
> #include "hw/boards.h"
> +#include "hw/compat.h"
>
> #define HPET_INTCAP "hpet-intcap"
>
> @@ -307,15 +308,8 @@ int e820_add_entry(uint64_t, uint64_t, uint32_t);
> int e820_get_num_entries(void);
> bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *);
>
> -#define PC_COMPAT_2_1 \
> - {\
> - .driver = "intel-hda",\
> - .property = "old_msi_addr",\
> - .value = "on",\
> - }
> -
> #define PC_COMPAT_2_0 \
> - PC_COMPAT_2_1, \
> + HW_COMPAT_2_1, \
> {\
> .driver = "virtio-scsi-pci",\
> .property = "any_layout",\
> diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
> index 553afdd..a1634ab 100644
> --- a/hw/i386/pc_piix.c
> +++ b/hw/i386/pc_piix.c
> @@ -502,7 +502,7 @@ static QEMUMachine pc_i440fx_machine_v2_1 = {
> .name = "pc-i440fx-2.1",
> .init = pc_init_pci,
> .compat_props = (GlobalProperty[]) {
> - PC_COMPAT_2_1,
> + HW_COMPAT_2_1,
> { /* end of list */ }
> },
> };
> diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
> index a199043..f330f7a 100644
> --- a/hw/i386/pc_q35.c
> +++ b/hw/i386/pc_q35.c
> @@ -365,7 +365,7 @@ static QEMUMachine pc_q35_machine_v2_1 = {
> .name = "pc-q35-2.1",
> .init = pc_q35_init,
> .compat_props = (GlobalProperty[]) {
> - PC_COMPAT_2_1,
> + HW_COMPAT_2_1,
> { /* end of list */ }
> },
> };
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index 2becc9f..623f626 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -57,6 +57,8 @@
> #include "trace.h"
> #include "hw/nmi.h"
>
> +#include "hw/compat.h"
> +
> #include <libfdt.h>
>
> /* SLOF memory layout:
> @@ -1689,10 +1691,15 @@ static const TypeInfo spapr_machine_info = {
> static void spapr_machine_2_1_class_init(ObjectClass *oc, void *data)
> {
> MachineClass *mc = MACHINE_CLASS(oc);
> + static GlobalProperty compat_props[] = {
> + HW_COMPAT_2_1,
> + { /* end of list */ }1
> + };
>
> mc->name = "pseries-2.1";
> mc->desc = "pSeries Logical Partition (PAPR compliant) v2.1";
> mc->is_default = 0;
> + mc->compat_props = compat_props;
> }
>
> static const TypeInfo spapr_machine_2_1_info = {
> diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
> index a827cd4..a499a3c 100644
> --- a/hw/virtio/virtio-pci.c
> +++ b/hw/virtio/virtio-pci.c
> @@ -86,9 +86,6 @@
> * 12 is historical, and due to x86 page size. */
> #define VIRTIO_PCI_QUEUE_ADDR_SHIFT 12
>
> -/* Flags track per-device state like workarounds for quirks in older guests. */
> -#define VIRTIO_PCI_FLAG_BUS_MASTER_BUG (1 << 0)
> -
> static void virtio_pci_bus_new(VirtioBusState *bus, size_t bus_size,
> VirtIOPCIProxy *dev);
>
> @@ -323,14 +320,6 @@ static void virtio_ioport_write(void *opaque, uint32_t addr, uint32_t val)
> proxy->pci_dev.config[PCI_COMMAND] |
> PCI_COMMAND_MASTER, 1);
> }
> -
> - /* Linux before 2.6.34 sets the device as OK without enabling
> - the PCI device bus master bit. In this case we need to disable
> - some safety checks. */
> - if ((val & VIRTIO_CONFIG_S_DRIVER_OK) &&
> - !(proxy->pci_dev.config[PCI_COMMAND] & PCI_COMMAND_MASTER)) {
> - proxy->flags |= VIRTIO_PCI_FLAG_BUS_MASTER_BUG;
> - }
> break;
> case VIRTIO_MSI_CONFIG_VECTOR:
> msix_vector_unuse(&proxy->pci_dev, vdev->config_vector);
> @@ -483,8 +472,7 @@ static void virtio_write_config(PCIDevice *pci_dev, uint32_t address,
> pci_default_write_config(pci_dev, address, val, len);
>
> if (range_covers_byte(address, len, PCI_COMMAND) &&
> - !(pci_dev->config[PCI_COMMAND] & PCI_COMMAND_MASTER) &&1
> - !(proxy->flags & VIRTIO_PCI_FLAG_BUS_MASTER_BUG)) {
> + !(pci_dev->config[PCI_COMMAND] & PCI_COMMAND_MASTER)) {
> virtio_pci_stop_ioeventfd(proxy);
> virtio_set_status(vdev, vdev->status & ~VIRTIO_CONFIG_S_DRIVER_OK);
> }
> @@ -895,11 +883,15 @@ static void virtio_pci_vmstate_change(DeviceState *d, bool running)
> VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
>
> if (running) {
> - /* Try to find out if the guest has bus master disabled, but is
> - in ready state. Then we have a buggy guest OS. */
> - if ((vdev->status & VIRTIO_CONFIG_S_DRIVER_OK) &&
> + /* Old QEMU versions did not set bus master enable on status write.
> + * Detect DRIVER set and enable it.
> + */
> + if ((proxy->flags & VIRTIO_PCI_FLAG_BUS_MASTER_BUG_MIGRATION) &&
> + (vdev->status & VIRTIO_CONFIG_S_DRIVER) &&
> !(proxy->pci_dev.config[PCI_COMMAND] & PCI_COMMAND_MASTER)) {
> - proxy->flags |= VIRTIO_PCI_FLAG_BUS_MASTER_BUG;
> + pci_default_write_config(&proxy->pci_dev, PCI_COMMAND,
> + proxy->pci_dev.config[PCI_COMMAND] |
> + PCI_COMMAND_MASTER, 1);
> }
> virtio_pci_start_ioeventfd(proxy);
> } else {
> @@ -1040,10 +1032,11 @@ static void virtio_pci_reset(DeviceState *qdev)
> virtio_pci_stop_ioeventfd(proxy);
> virtio_bus_reset(bus);
> msix_unuse_all_vectors(&proxy->pci_dev);
> - proxy->flags &= ~VIRTIO_PCI_FLAG_BUS_MASTER_BUG;
> }
>
> static Property virtio_pci_properties[] = {
> + DEFINE_PROP_BIT("virtio-pci-bus-master-bug-migration", VirtIOPCIProxy, flags,
> + VIRTIO_PCI_FLAG_BUS_MASTER_BUG_MIGRATION_BIT, false),
> DEFINE_VIRTIO_COMMON_FEATURES(VirtIOPCIProxy, host_features),
> DEFINE_PROP_END_OF_LIST(),
> };
next prev parent reply other threads:[~2014-10-20 14:15 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-10-20 6:58 [Qemu-devel] [PATCH v3] virtio-pci: fix migration for pci bus master Michael S. Tsirkin
2014-10-20 14:15 ` Greg Kurz [this message]
2014-10-20 16:08 ` Alexander Graf
2014-10-20 16:40 ` Greg Kurz
2014-10-21 10:16 ` Michael S. Tsirkin
2014-10-21 11:35 ` Alexander Graf
2014-10-21 12:10 ` Michael S. Tsirkin
2014-10-21 12:12 ` Alexander Graf
2014-10-21 12:36 ` Greg Kurz
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=20141020161532.7703e6f3@bahia.local \
--to=gkurz@linux.vnet.ibm.com \
--cc=agraf@suse.de \
--cc=aliguori@amazon.com \
--cc=mst@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.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.