From 6ed7ecb268b0ae4c8fdc7bf7dbd7cd5a5e27f02f Mon Sep 17 00:00:00 2001 From: Ard van Breemen Date: Fri, 5 Jan 2007 16:36:21 -0800 Subject: [PATCH] --- yaml --- r: 45232 b: refs/heads/master c: 6ae4adf50380d0fc5176a76d98d324f8fa491a8f h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/pci/search.c | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index f74ca6fcf831..38217354abdd 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a416aba637dcb4127595c02a59041cd278422f7e +refs/heads/master: 6ae4adf50380d0fc5176a76d98d324f8fa491a8f diff --git a/trunk/drivers/pci/search.c b/trunk/drivers/pci/search.c index 45f2b20ef513..fab381ed853c 100644 --- a/trunk/drivers/pci/search.c +++ b/trunk/drivers/pci/search.c @@ -193,6 +193,18 @@ static struct pci_dev * pci_find_subsys(unsigned int vendor, struct pci_dev *dev; WARN_ON(in_interrupt()); + + /* + * pci_find_subsys() can be called on the ide_setup() path, super-early + * in boot. But the down_read() will enable local interrupts, which + * can cause some machines to crash. So here we detect and flag that + * situation and bail out early. + */ + if (unlikely(list_empty(&pci_devices))) { + printk(KERN_INFO "pci_find_subsys() called while pci_devices " + "is still empty\n"); + return NULL; + } down_read(&pci_bus_sem); n = from ? from->global_list.next : pci_devices.next; @@ -259,6 +271,18 @@ pci_get_subsys(unsigned int vendor, unsigned int device, struct pci_dev *dev; WARN_ON(in_interrupt()); + + /* + * pci_get_subsys() can potentially be called by drivers super-early + * in boot. But the down_read() will enable local interrupts, which + * can cause some machines to crash. So here we detect and flag that + * situation and bail out early. + */ + if (unlikely(list_empty(&pci_devices))) { + printk(KERN_NOTICE "pci_get_subsys() called while pci_devices " + "is still empty\n"); + return NULL; + } down_read(&pci_bus_sem); n = from ? from->global_list.next : pci_devices.next;