Skip to content

Commit

Permalink
xen/pci: Try harder to get PXM information for Xen
Browse files Browse the repository at this point in the history
If the device being added to Xen is not contained in the ACPI table,
walk the PCI device tree to find a parent that is contained in the ACPI
table before finding the PXM information from this device.

Previously, it would try to get a handle for the device, then the
device's bridge, then the physfn.  This changes the order so that it
tries to get a handle for the device, then the physfn, the walks up the
PCI device tree.

Signed-off-by: Ross Lagerwall <ross.lagerwall@citrix.com>
Signed-off-by: David Vrabel <david.vrabel@citrix.com>
  • Loading branch information
Ross Lagerwall authored and David Vrabel committed Apr 15, 2015
1 parent ccc9d90 commit 0b97b03
Showing 1 changed file with 13 additions and 2 deletions.
15 changes: 13 additions & 2 deletions drivers/xen/pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

#include <linux/pci.h>
#include <linux/acpi.h>
#include <linux/pci-acpi.h>
#include <xen/xen.h>
#include <xen/interface/physdev.h>
#include <xen/interface/xen.h>
Expand Down Expand Up @@ -67,12 +68,22 @@ static int xen_add_device(struct device *dev)

#ifdef CONFIG_ACPI
handle = ACPI_HANDLE(&pci_dev->dev);
if (!handle && pci_dev->bus->bridge)
handle = ACPI_HANDLE(pci_dev->bus->bridge);
#ifdef CONFIG_PCI_IOV
if (!handle && pci_dev->is_virtfn)
handle = ACPI_HANDLE(physfn->bus->bridge);
#endif
if (!handle) {
/*
* This device was not listed in the ACPI name space at
* all. Try to get acpi handle of parent pci bus.
*/
struct pci_bus *pbus;
for (pbus = pci_dev->bus; pbus; pbus = pbus->parent) {
handle = acpi_pci_get_bridge_handle(pbus);
if (handle)
break;
}
}
if (handle) {
acpi_status status;

Expand Down

0 comments on commit 0b97b03

Please sign in to comment.