Re: [PATCH v3 5/8] ACPI, PCI: change acpi_pci_find_root implementation
From: Bjorn Helgaas <bhelgaas@google.com>
Date: 2012-09-21 17:58:19
Also in:
linux-pci
On Fri, Sep 21, 2012 at 1:14 AM, Taku Izumi [off-list ref] wrote:
On Wed, 19 Sep 2012 16:03:27 -0600 Bjorn Helgaas [off-list ref] wrote:quoted
On Tue, Sep 18, 2012 at 12:23 AM, Taku Izumi [off-list ref] wrote:quoted
This patch changes the implementation of acpi_pci_find_root(). We can access acpi_pci_root without scanning acpi_pci_roots list. If hostbridge hotplug is supported, acpi_pci_roots list will be protected by mutex. We should not access acpi_pci_roots list if preventable to lessen deadlock risk. Signed-off-by: Taku Izumi <redacted> --- drivers/acpi/pci_root.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) Index: Bjorn-next-0903/drivers/acpi/pci_root.c ===================================================================--- Bjorn-next-0903.orig/drivers/acpi/pci_root.c +++ Bjorn-next-0903/drivers/acpi/pci_root.c@@ -265,12 +265,15 @@ static acpi_status acpi_pci_osc_support( struct acpi_pci_root *acpi_pci_find_root(acpi_handle handle) { struct acpi_pci_root *root; + struct acpi_device *device; - list_for_each_entry(root, &acpi_pci_roots, node) { - if (root->device->handle == handle) - return root; - } - return NULL; + if (acpi_bus_get_device(handle, &device) || + acpi_match_device_ids(device, root_device_ids))What's the purpose of the acpi_match_device_ids() check? It's not obvious, so worth calling it out in the changelog, and maybe even a comment in the code.My intention is to reject acpi_handle which doesn't represent hostbrige. I think this is reasonable...
Yes, I understand that part. I was just trying to figure out why that check is needed. Is there a path where we can call acpi_pci_find_root() with a handle that is *not* a PNP0A03 device? I looked at all the callers, and as far as I can tell, the supplied handle is always for a host bridge device. But I guess I don't object to the check. This is just another case of a lookup that in many cases is unnecessary because we should have the struct acpi_pci_root * available already.
quoted
Nice to get rid of the list traversal.quoted
+ return NULL; + + root = acpi_driver_data(device); + + return root; } EXPORT_SYMBOL_GPL(acpi_pci_find_root);-- Taku Izumi [off-list ref]