From: Ard -kwaak- van Breemen <ard@telegraafnet.nl>
To: Andrew Morton <akpm@osdl.org>
Cc: Greg KH <greg@kroah.com>,
"Zhang, Yanmin" <yanmin.zhang@intel.com>,
Chuck Ebbert <76306.1226@compuserve.com>,
Yinghai Lu <yinghai.lu@amd.com>,
take@libero.it, agalanin@mera.ru, linux-kernel@vger.kernel.org,
bugme-daemon@bugzilla.kernel.org,
"Eric W. Biederman" <ebiederm@xmission.com>
Subject: [PATCH 2.6.20-rc2-git1] PCI: prevent down_read when pci_devices is empty
Date: Sat, 30 Dec 2006 21:15:48 +0100 [thread overview]
Message-ID: <20061230201548.GV912@telegraafnet.nl> (raw)
In-Reply-To: <20061229154251.GR912@telegraafnet.nl>
The pci_find_subsys gets called very early by obsolete ide setup
parameters. This is a bogus call since pci is not initialized
yet, so the list is empty. But in the mean time, interrupts get
enabled by down_read. This can result in a kernel panic when the
irq controller gets initialized.
This patch checks if the device list is empty before taking the
semaphore, and hence will not enable irq's. Furthermore it will
inform that it is called while pci_devices is empty as a reminder
that the ide code needs to be fixed.
The pci_get_subsys can get called in the same manner, and as such
is patched in the same manner.
Signed-off-by: Ard van Breemen <ard@telegraafnet.nl>
----
This patch is an adaption of Andrew Mortons patch.
--- linux-2.6.19.vanilla/drivers/pci/search.c 2006-11-29 21:57:37.000000000 +0000
+++ linux-2.6.19.ok/drivers/pci/search.c 2006-12-29 15:38:18.000000000 +0000
@@ -193,6 +193,17 @@ static struct pci_dev * pci_find_subsys(
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 +270,16 @@ pci_get_subsys(unsigned int vendor, unsi
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;
prev parent reply other threads:[~2006-12-30 20:15 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-12-22 4:41 [Bug 7505] Linux-2.6.18 fails to boot on AMD64 machine Zhang, Yanmin
2006-12-22 8:22 ` Ard -kwaak- van Breemen
2006-12-22 8:30 ` Andrew Morton
2006-12-22 9:32 ` Stefano Takekawa
2006-12-22 9:43 ` Andrew Morton
2006-12-22 13:23 ` Stefano Takekawa
2006-12-22 10:30 ` Ard -kwaak- van Breemen
2006-12-22 14:00 ` Ard -kwaak- van Breemen
2006-12-22 14:16 ` Ard -kwaak- van Breemen
2006-12-22 19:10 ` Andrew Morton
2006-12-22 14:35 ` Ard -kwaak- van Breemen
2006-12-29 15:08 ` Ard -kwaak- van Breemen
2006-12-22 14:41 ` Ard -kwaak- van Breemen
2006-12-22 15:42 ` Ard -kwaak- van Breemen
2006-12-28 23:51 ` Andrew Morton
2006-12-29 10:18 ` Stefano Takekawa
2006-12-29 12:51 ` Ard -kwaak- van Breemen
2006-12-29 13:27 ` Ard -kwaak- van Breemen
2006-12-29 14:10 ` Ard -kwaak- van Breemen
2006-12-29 15:01 ` Ard -kwaak- van Breemen
2006-12-29 15:05 ` Ard -kwaak- van Breemen
2006-12-29 15:24 ` Ard -kwaak- van Breemen
2006-12-29 15:42 ` Ard -kwaak- van Breemen
2006-12-30 19:46 ` [PATCH 2.6.20-rc2-git1] start_kernel: Test if irq's got enabled early, barf, and disable them again Ard -kwaak- van Breemen
2008-03-03 22:46 ` Tony Luck
2008-03-04 0:34 ` Stephen Rothwell
2006-12-30 19:58 ` [PATCH 2.6.20-rc2-git1] kernelparams: detect if and which parameter parsing enabled irq's Ard -kwaak- van Breemen
2006-12-30 20:15 ` Ard -kwaak- van Breemen [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20061230201548.GV912@telegraafnet.nl \
--to=ard@telegraafnet.nl \
--cc=76306.1226@compuserve.com \
--cc=agalanin@mera.ru \
--cc=akpm@osdl.org \
--cc=bugme-daemon@bugzilla.kernel.org \
--cc=ebiederm@xmission.com \
--cc=greg@kroah.com \
--cc=linux-kernel@vger.kernel.org \
--cc=take@libero.it \
--cc=yanmin.zhang@intel.com \
--cc=yinghai.lu@amd.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®