From mboxrd@z Thu Jan 1 00:00:00 1970 From: Konrad Rzeszutek Wilk Subject: Re: [PATCH] [pv-ops] fix dom0 S3 when MSI is used. Date: Wed, 17 Mar 2010 10:28:29 -0400 Message-ID: <20100317142829.GA5861@phenom.dumpdata.com> References: <4FA716B1526C7C4DB0375C6DADBC4EA342A7A7E95E@LONPMAILBOX01.citrite.net> <4B182D87.6030901@goop.org> <4B187513.80003@goop.org> <4B200727.8040000@goop.org> <1260436078.23698.45463.camel@zakaz.uk.xensource.com> <4B2135CC.6000004@goop.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Return-path: Content-Disposition: inline In-Reply-To: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: "Cui, Dexuan" Cc: Jeremy Fitzhardinge , "xen-devel@lists.xensource.com" List-Id: xen-devel@lists.xenproject.org On Wed, Mar 17, 2010 at 04:46:47PM +0800, Cui, Dexuan wrote: > The old commit a234848f works only when the device supports D3hot; when the > device only supports D3cold, the device doesn't work properly after resuming > from Dom0 S3. > A better workaround is invoking the PHYSDEVOP_restore_msi hypercall. > The patch reverts the old commit and invokes the hypercall. > > Signed-off-by: Dexuan Cui > > diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c > index b40c6d0..c6bffe2 100644 > --- a/drivers/pci/msi.c > +++ b/drivers/pci/msi.c > @@ -20,6 +20,7 @@ > #include > #include > > +#include > #include > > #include "pci.h" > @@ -271,8 +272,7 @@ void write_msi_msg(unsigned int irq, struct msi_msg *msg) > { > struct irq_desc *desc = irq_to_desc(irq); > > - if (!xen_initial_domain()) > - write_msi_msg_desc(desc, msg); > + write_msi_msg_desc(desc, msg); Nice. That will remove the other platofmr build problem. > } > > static int msi_free_irqs(struct pci_dev* dev); > @@ -347,6 +347,20 @@ static void __pci_restore_msix_state(struct pci_dev *dev) > > void pci_restore_msi_state(struct pci_dev *dev) > { > + if (xen_initial_domain()) { That won't do. If you try to compile this kernel on other platforms (say PPC), this will throw a huge problem. > + struct physdev_restore_msi physdev; > + > + if (!dev->msi_enabled && !dev->msix_enabled) > + return; This seems redundant. I think the problem you are trying to address is doing to show up when doing PC passthrough using pciback and xen-pcifront. The mechanims that was employed there to make it work, was to utilize the arch_setup_msi_irqs in (arch/x86/kernel/apic/io_apic.c) and make it call functions in arch/x86/pci/xen.c. That code then figures out if you are running in priviliged or un-priviliged mode and makes the appropiate call. Perhaps you should using that idea and expand on it. I would suggest you take a look at the how PPC implements this and see if there is something that can be borrowed from their mechanism. > + > + pci_intx_for_msi(dev, 0); > + > + physdev.bus = dev->bus->number; > + physdev.devfn = dev->devfn; > + HYPERVISOR_physdev_op(PHYSDEVOP_restore_msi, &physdev); > + > + return; > + } > __pci_restore_msi_state(dev); > __pci_restore_msix_state(dev); > } > diff --git a/include/xen/interface/physdev.h b/include/xen/interface/physdev.h > index ac5de37..516d2b4 100644 > --- a/include/xen/interface/physdev.h > +++ b/include/xen/interface/physdev.h > @@ -144,6 +144,13 @@ struct physdev_manage_pci { > uint8_t devfn; > }; > > +#define PHYSDEVOP_restore_msi 19 > +struct physdev_restore_msi { > + /* IN */ > + uint8_t bus; > + uint8_t devfn; > +}; > + > #define PHYSDEVOP_manage_pci_add_ext 20 > struct physdev_manage_pci_ext { > /* IN */ > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xensource.com > http://lists.xensource.com/xen-devel