Merge branches 'stable/drivers-3.2', 'stable/drivers.bugfixes-3.2' and 'stable/pci.fixes-3.2' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen
* 'stable/drivers-3.2' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen: xenbus: don't rely on xen_initial_domain to detect local xenstore xenbus: Fix loopback event channel assuming domain 0 xen/pv-on-hvm:kexec: Fix implicit declaration of function 'xen_hvm_domain' xen/pv-on-hvm kexec: add xs_reset_watches to shutdown watches from old kernel xen/pv-on-hvm kexec: update xs_wire.h:xsd_sockmsg_type from xen-unstable xen/pv-on-hvm kexec+kdump: reset PV devices in kexec or crash kernel xen/pv-on-hvm kexec: rebind virqs to existing eventchannel ports xen/pv-on-hvm kexec: prevent crash in xenwatch_thread() when stale watch events arrive * 'stable/drivers.bugfixes-3.2' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen: xen/pciback: Check if the device is found instead of blindly assuming so. xen/pciback: Do not dereference psdev during printk when it is NULL. xen: remove XEN_PLATFORM_PCI config option xen: XEN_PVHVM depends on PCI xen/pciback: double lock typo xen/pciback: use mutex rather than spinlock in vpci backend xen/pciback: Use mutexes when working with Xenbus state transitions. xen/pciback: miscellaneous adjustments xen/pciback: use mutex rather than spinlock in passthrough backend xen/pciback: use resource_size() * 'stable/pci.fixes-3.2' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen: xen/pci: support multi-segment systems xen-swiotlb: When doing coherent alloc/dealloc check before swizzling the MFNs. xen/pci: make bus notifier handler return sane values xen-swiotlb: fix printk and panic args xen-swiotlb: Fix wrong panic. xen-swiotlb: Retry up three times to allocate Xen-SWIOTLB xen-pcifront: Update warning comment to use 'e820_host' option.
This commit is contained in:
@@ -252,6 +252,8 @@ error:
|
||||
}
|
||||
|
||||
#ifdef CONFIG_XEN_DOM0
|
||||
static bool __read_mostly pci_seg_supported = true;
|
||||
|
||||
static int xen_initdom_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
|
||||
{
|
||||
int ret = 0;
|
||||
@@ -269,10 +271,11 @@ static int xen_initdom_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
|
||||
|
||||
memset(&map_irq, 0, sizeof(map_irq));
|
||||
map_irq.domid = domid;
|
||||
map_irq.type = MAP_PIRQ_TYPE_MSI;
|
||||
map_irq.type = MAP_PIRQ_TYPE_MSI_SEG;
|
||||
map_irq.index = -1;
|
||||
map_irq.pirq = -1;
|
||||
map_irq.bus = dev->bus->number;
|
||||
map_irq.bus = dev->bus->number |
|
||||
(pci_domain_nr(dev->bus) << 16);
|
||||
map_irq.devfn = dev->devfn;
|
||||
|
||||
if (type == PCI_CAP_ID_MSIX) {
|
||||
@@ -289,7 +292,20 @@ static int xen_initdom_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
|
||||
map_irq.entry_nr = msidesc->msi_attrib.entry_nr;
|
||||
}
|
||||
|
||||
ret = HYPERVISOR_physdev_op(PHYSDEVOP_map_pirq, &map_irq);
|
||||
ret = -EINVAL;
|
||||
if (pci_seg_supported)
|
||||
ret = HYPERVISOR_physdev_op(PHYSDEVOP_map_pirq,
|
||||
&map_irq);
|
||||
if (ret == -EINVAL && !pci_domain_nr(dev->bus)) {
|
||||
map_irq.type = MAP_PIRQ_TYPE_MSI;
|
||||
map_irq.index = -1;
|
||||
map_irq.pirq = -1;
|
||||
map_irq.bus = dev->bus->number;
|
||||
ret = HYPERVISOR_physdev_op(PHYSDEVOP_map_pirq,
|
||||
&map_irq);
|
||||
if (ret != -EINVAL)
|
||||
pci_seg_supported = false;
|
||||
}
|
||||
if (ret) {
|
||||
dev_warn(&dev->dev, "xen map irq failed %d for %d domain\n",
|
||||
ret, domid);
|
||||
|
Reference in New Issue
Block a user