From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36761) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XMDwW-0002C4-32 for qemu-devel@nongnu.org; Tue, 26 Aug 2014 06:25:43 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XMDwO-0004Eq-8Q for qemu-devel@nongnu.org; Tue, 26 Aug 2014 06:25:35 -0400 Received: from mail-pa0-f52.google.com ([209.85.220.52]:63955) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XMDwO-0004D2-3F for qemu-devel@nongnu.org; Tue, 26 Aug 2014 06:25:28 -0400 Received: by mail-pa0-f52.google.com with SMTP id bj1so23305018pad.11 for ; Tue, 26 Aug 2014 03:25:25 -0700 (PDT) Message-ID: <53FC6090.7090703@ozlabs.ru> Date: Tue, 26 Aug 2014 20:25:20 +1000 From: Alexey Kardashevskiy MIME-Version: 1.0 References: <1408528328-11560-1-git-send-email-gwshan@linux.vnet.ibm.com> <1408528328-11560-3-git-send-email-gwshan@linux.vnet.ibm.com> In-Reply-To: <1408528328-11560-3-git-send-email-gwshan@linux.vnet.ibm.com> Content-Type: text/plain; charset=koi8-r Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [RFC PATCH 2/2] VFIO: Clear stale MSIx table during EEH reset List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Gavin Shan , qemu-devel@nongnu.org Cc: alex.williamson@redhat.com On 08/20/2014 07:52 PM, Gavin Shan wrote: > 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 clears stale MSIx table before EEH PE reset so that MSIx > table could be restored properly after EEH PE reset. > > Signed-off-by: Gavin Shan > --- > hw/misc/vfio.c | 24 ++++++++++++++++++++++++ > 1 file changed, 24 insertions(+) > > diff --git a/hw/misc/vfio.c b/hw/misc/vfio.c > index 1a3e7eb..3cf7f02 100644 > --- a/hw/misc/vfio.c > +++ b/hw/misc/vfio.c > @@ -4424,6 +4424,8 @@ int vfio_container_ioctl(AddressSpace *as, int32_t groupid, > { > VFIOGroup *group; > VFIOContainer *container; > + VFIODevice *vdev; > + struct vfio_eeh_pe_op *arg; > int ret = -1; > > group = vfio_get_group(groupid, as); > @@ -4442,7 +4444,29 @@ int vfio_container_ioctl(AddressSpace *as, int32_t groupid, > switch (req) { > case VFIO_CHECK_EXTENSION: > case VFIO_IOMMU_SPAPR_TCE_GET_INFO: > + break; > case VFIO_EEH_PE_OP: > + arg = (struct vfio_eeh_pe_op *)param; > + switch (arg->op) { > + case VFIO_EEH_PE_RESET_HOT: > + case VFIO_EEH_PE_RESET_FUNDAMENTAL: > + /* > + * 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. > + */ > + QLIST_FOREACH(vdev, &group->device_list, next) { > + if (msix_enabled(&vdev->pdev)) { > + vfio_disable_msix(vdev); > + } > + > + msix_reset(&vdev->pdev); > + } > + > + break; > + } This has to be done in spapr_pci_vfio (but we do not have there access to vfio_disable_msix) or in the way that x86 would benefit from too but in this case yes, we need an opinion from Alex (Williamson)... > + > break; > default: > /* Return an error on unknown requests */ > -- Alexey