From: David Gibson <david@gibson.dropbear.id.au>
To: agraf@suse.de, afaerber@suse.de
Cc: lvivier@redhat.com, thuth@redhat.com, aik@ozlabs.ru,
qemu-devel@nongnu.org, mdroth@linux.vnet.ibm.com,
qemu-ppc@nongnu.org, bharata@linux.vnet.ibm.com,
Gavin Shan <gwshan@linux.vnet.ibm.com>,
David Gibson <david@gibson.dropbear.id.au>
Subject: [Qemu-devel] [PATCH 27/27] sPAPR: Clear stale MSIx table during EEH reset
Date: Thu, 2 Jul 2015 16:23:28 +1000 [thread overview]
Message-ID: <1435818208-11808-28-git-send-email-david@gibson.dropbear.id.au> (raw)
In-Reply-To: <1435818208-11808-1-git-send-email-david@gibson.dropbear.id.au>
From: Gavin Shan <gwshan@linux.vnet.ibm.com>
The PCI device MSIx table is cleaned out in hardware after EEH PE
reset. However, we still hold the stale MSIx entries in QEMU, which
should be cleared accordingly. Otherwise, we will run into another
(recursive) EEH error and the PCI devices contained in the PE have
to be offlined exceptionally.
The patch introduces function spapr_phb_vfio_eeh_pre_reset(), which
is called by sPAPR when asserting hot or fundamental reset, to clear
stale MSIx table for VFIO PCI devices before EEH PE reset so that
MSIx table could be restored properly after EEH PE reset.
Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
hw/ppc/spapr_pci_vfio.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 46 insertions(+)
diff --git a/hw/ppc/spapr_pci_vfio.c b/hw/ppc/spapr_pci_vfio.c
index 8104074..cca45ed 100644
--- a/hw/ppc/spapr_pci_vfio.c
+++ b/hw/ppc/spapr_pci_vfio.c
@@ -19,6 +19,7 @@
#include "hw/ppc/spapr.h"
#include "hw/pci-host/spapr.h"
+#include "hw/pci/msix.h"
#include "linux/vfio.h"
#include "hw/vfio/vfio.h"
@@ -159,6 +160,49 @@ static int spapr_phb_vfio_eeh_get_state(sPAPRPHBState *sphb, int *state)
return RTAS_OUT_SUCCESS;
}
+static void spapr_phb_vfio_eeh_clear_dev_msix(PCIBus *bus,
+ PCIDevice *pdev,
+ void *opaque)
+{
+ /* Check if the device is VFIO PCI device */
+ if (!object_dynamic_cast(OBJECT(pdev), "vfio-pci")) {
+ return;
+ }
+
+ /*
+ * The MSIx table will be cleaned out by reset. We need
+ * disable it so that it can be reenabled properly. Also,
+ * the cached MSIx table should be cleared as it's not
+ * reflecting the contents in hardware.
+ */
+ if (msix_enabled(pdev)) {
+ uint16_t flags;
+
+ flags = pci_host_config_read_common(pdev,
+ pdev->msix_cap + PCI_MSIX_FLAGS,
+ pci_config_size(pdev), 2);
+ flags &= ~PCI_MSIX_FLAGS_ENABLE;
+ pci_host_config_write_common(pdev,
+ pdev->msix_cap + PCI_MSIX_FLAGS,
+ pci_config_size(pdev), flags, 2);
+ }
+
+ msix_reset(pdev);
+}
+
+static void spapr_phb_vfio_eeh_clear_bus_msix(PCIBus *bus, void *opaque)
+{
+ pci_for_each_device(bus, pci_bus_num(bus),
+ spapr_phb_vfio_eeh_clear_dev_msix, NULL);
+}
+
+static void spapr_phb_vfio_eeh_pre_reset(sPAPRPHBState *sphb)
+{
+ PCIHostState *phb = PCI_HOST_BRIDGE(sphb);
+
+ pci_for_each_bus(phb->bus, spapr_phb_vfio_eeh_clear_bus_msix, NULL);
+}
+
static int spapr_phb_vfio_eeh_reset(sPAPRPHBState *sphb, int option)
{
sPAPRPHBVFIOState *svphb = SPAPR_PCI_VFIO_HOST_BRIDGE(sphb);
@@ -170,9 +214,11 @@ static int spapr_phb_vfio_eeh_reset(sPAPRPHBState *sphb, int option)
op.op = VFIO_EEH_PE_RESET_DEACTIVATE;
break;
case RTAS_SLOT_RESET_HOT:
+ spapr_phb_vfio_eeh_pre_reset(sphb);
op.op = VFIO_EEH_PE_RESET_HOT;
break;
case RTAS_SLOT_RESET_FUNDAMENTAL:
+ spapr_phb_vfio_eeh_pre_reset(sphb);
op.op = VFIO_EEH_PE_RESET_FUNDAMENTAL;
break;
default:
--
2.4.3
next prev parent reply other threads:[~2015-07-02 6:23 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-02 6:23 [Qemu-devel] [PATCH 00/27] sPAPR updates 2015-07-02 David Gibson
2015-07-02 6:23 ` [Qemu-devel] [PATCH 01/27] spapr: ensure we have at least one XICS server David Gibson
2015-07-02 6:23 ` [Qemu-devel] [PATCH 02/27] pseries: Update SLOF firmware image to qemu-slof-20150429 David Gibson
2015-07-02 6:23 ` [Qemu-devel] [PATCH 03/27] spapr: Merge sPAPREnvironment into sPAPRMachineState David Gibson
2015-07-02 6:23 ` [Qemu-devel] [PATCH 04/27] spapr: Remove obsolete ram_limit field from sPAPRMachineState David Gibson
2015-07-02 6:23 ` [Qemu-devel] [PATCH 05/27] spapr: Remove obsolete entry_point " David Gibson
2015-07-02 6:23 ` [Qemu-devel] [PATCH 06/27] spapr: Add sPAPRMachineClass David Gibson
2015-07-02 6:23 ` [Qemu-devel] [PATCH 07/27] spapr_pci: encode missing 64-bit memory address space David Gibson
2015-07-02 6:23 ` [Qemu-devel] [PATCH 08/27] spapr_pci: encode class code including Prog IF register David Gibson
2015-07-02 6:23 ` [Qemu-devel] [PATCH 09/27] spapr_pci: set device node unit address as hex David Gibson
2015-07-02 6:23 ` [Qemu-devel] [PATCH 10/27] spapr_iommu: drop erroneous check in h_put_tce_indirect() David Gibson
2015-07-02 6:23 ` [Qemu-devel] [PATCH 11/27] spapr_iommu: translate sPAPRTCEAccess to IOMMUAccessFlags David Gibson
2015-07-02 6:23 ` [Qemu-devel] [PATCH 12/27] Revert "hw/ppc/spapr_pci.c: Avoid functions not in glib 2.12 (g_hash_table_iter_*)" David Gibson
2015-07-02 6:23 ` [Qemu-devel] [PATCH 13/27] spapr: Consider max_cpus during xics initialization David Gibson
2015-07-02 6:23 ` [Qemu-devel] [PATCH 14/27] spapr: Support ibm, lrdr-capacity device tree property David Gibson
2015-07-02 6:23 ` [Qemu-devel] [PATCH 15/27] cpus: Add a macro to walk CPUs in reverse David Gibson
2015-07-02 6:23 ` [Qemu-devel] [PATCH 16/27] spapr: Reorganize CPU dt generation code David Gibson
2015-07-02 6:23 ` [Qemu-devel] [PATCH 17/27] spapr: Consolidate cpu init code into a routine David Gibson
2015-07-02 6:23 ` [Qemu-devel] [PATCH 18/27] ppc: Update cpu_model in MachineState David Gibson
2015-07-02 6:23 ` [Qemu-devel] [PATCH 19/27] xics_kvm: Don't enable KVM_CAP_IRQ_XICS if already enabled David Gibson
2015-07-02 6:23 ` [Qemu-devel] [PATCH 20/27] spapr_pci: enumerate and add PCI device tree David Gibson
2015-07-02 6:23 ` [Qemu-devel] [PATCH 21/27] spapr_pci: populate ibm,loc-code David Gibson
2015-07-02 6:23 ` [Qemu-devel] [PATCH 22/27] spapr_pci: drop redundant args in spapr_[populate, create]_pci_child_dt David Gibson
2015-07-02 6:23 ` [Qemu-devel] [PATCH 23/27] spapr_vty: lookup should only return valid VTY objects David Gibson
2015-07-02 6:23 ` [Qemu-devel] [PATCH 24/27] spapr-vty: Use TYPE_ definition instead of hardcoding David Gibson
2015-07-02 6:23 ` [Qemu-devel] [PATCH 25/27] sPAPR: Don't enable EEH on emulated PCI devices David Gibson
2015-07-02 6:23 ` [Qemu-devel] [PATCH 26/27] sPAPR: Reenable EEH functionality on reboot David Gibson
2015-07-02 6:23 ` David Gibson [this message]
2015-07-07 12:39 ` [Qemu-devel] [PATCH 00/27] sPAPR updates 2015-07-02 Alexander Graf
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=1435818208-11808-28-git-send-email-david@gibson.dropbear.id.au \
--to=david@gibson.dropbear.id.au \
--cc=afaerber@suse.de \
--cc=agraf@suse.de \
--cc=aik@ozlabs.ru \
--cc=bharata@linux.vnet.ibm.com \
--cc=gwshan@linux.vnet.ibm.com \
--cc=lvivier@redhat.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=thuth@redhat.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).