| From 1a4b1a41b8a3d5256019854e851beed063b34344 Mon Sep 17 00:00:00 2001 |
| From: Benjamin Herrenschmidt <benh@kernel.crashing.org> |
| Date: Tue, 13 Sep 2011 15:16:33 -0300 |
| Subject: pci: Don't crash when reading mpss from root complex |
| |
| From: Benjamin Herrenschmidt <benh@kernel.crashing.org> |
| |
| commit 1a4b1a41b8a3d5256019854e851beed063b34344 upstream. |
| |
| In pcie_find_smpss(), we have the following statement: |
| |
| if (dev->is_hotplug_bridge && (!list_is_singular(&dev->bus->devices) || |
| dev->bus->self->pcie_type != PCI_EXP_TYPE_ROOT_PORT)) |
| |
| The problem is that at least on my machine, this gets called for the |
| root complex (virtual P2P bridge), and dev->bus->self is NULL since |
| the parent bus for this is not itself anchor to a PCI device. |
| |
| This adds the necessary NULL check. |
| |
| Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> |
| Acked-by: Jon Mason <mason@myri.com> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/pci/probe.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/pci/probe.c |
| +++ b/drivers/pci/probe.c |
| @@ -1352,7 +1352,8 @@ static int pcie_find_smpss(struct pci_de |
| * will occur as normal. |
| */ |
| if (dev->is_hotplug_bridge && (!list_is_singular(&dev->bus->devices) || |
| - dev->bus->self->pcie_type != PCI_EXP_TYPE_ROOT_PORT)) |
| + (dev->bus->self && |
| + dev->bus->self->pcie_type != PCI_EXP_TYPE_ROOT_PORT))) |
| *smpss = 0; |
| |
| if (*smpss > dev->pcie_mpss) |