From: "Radim Krčmář" <rkrcmar@redhat.com>
To: linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org
Cc: Bjorn Helgaas <bhelgaas@google.com>,
"Michael S. Tsirkin" <mst@redhat.com>,
Alex Williamson <alex.williamson@redhat.com>,
Myron Stowe <myron.stowe@redhat.com>,
Joe Lawrence <Joe.Lawrence@stratus.com>,
Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>,
Isaku Yamahata <yamahata@valinux.co.jp>
Subject: [PATCH] PCI: avoid NULL deref in alloc_pcie_link_state
Date: Thu, 8 Aug 2013 15:57:07 +0200 [thread overview]
Message-ID: <1375970227-14794-1-git-send-email-rkrcmar@redhat.com> (raw)
PCIe switch can be connected directly to the PCIe root complex in QEMU;
ASPM does not expect this topology and dereferences NULL pointer when
initializing.
Downstream port can be also connected to the root complex without
upstream one, so code checks for both, otherwise they dereference NULL
on line drivers/pci/pcie/aspm.c:530 (alloc_pcie_link_state+13):
parent = pdev->bus->parent->self->link_state;
"pdev->bus->parent->self == NULL" if upstream port is connected directly
to the root bus and "pdev->bus->parent == NULL" in the second case.
v1 -> v2: (https://lkml.org/lkml/2013/6/19/753)
- Initialization is aborted in pcie_aspm_init_link_state, where other
special cases are being handled
- pci_is_root_bus is used
- Warning is printed
Reproducer for "downstream -- root" and "downstream -- upstream -- root"
(used qemu-kvm 1.5, q35 machine type might be missing on older ones)
for parent in pcie.0 upstream; do
qemu-kvm -m 128 -M q35 -nographic -no-reboot \
-device x3130-upstream,bus=pcie.0,id=upstream \
-device xio3130-downstream,bus=$parent,id=downstream,chassis=1 \
-device virtio-blk-pci,bus=downstream,id=virtio-zero,drive=zero \
-drive file=/dev/zero,id=zero,format=raw \
-kernel bzImage -append "console=ttyS0 panic=3" # pcie_aspm=off
done
ASPM in QEMU works if we connect upstream through root port
-device ioh3420,bus=pcie.0,id=root.0 \
-device x3130-upstream,bus=root.0,id=upstream
Signed-off-by: Radim Krčmář <rkrcmar@redhat.com>
---
drivers/pci/pcie/aspm.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c
index 403a443..209cd7f 100644
--- a/drivers/pci/pcie/aspm.c
+++ b/drivers/pci/pcie/aspm.c
@@ -570,6 +570,15 @@ void pcie_aspm_init_link_state(struct pci_dev *pdev)
pdev->bus->self)
return;
+ /* We require at least two ports between downstream and root bus */
+ if (pci_pcie_type(pdev) == PCI_EXP_TYPE_DOWNSTREAM &&
+ (pci_is_root_bus(pdev->bus) ||
+ pci_is_root_bus(pdev->bus->parent))) {
+ dev_warn(&pdev->dev, "ASPM disabled"
+ " (connected directly to root bus)\n");
+ return;
+ }
+
down_read(&pci_bus_sem);
if (list_empty(&pdev->subordinate->devices))
goto out;
--
1.8.3.1
next reply other threads:[~2013-08-08 13:57 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-08-08 13:57 Radim Krčmář [this message]
2013-08-08 14:00 ` [PATCH v2] PCI: avoid NULL deref in alloc_pcie_link_state Radim Krčmář
2013-08-23 0:02 ` [PATCH] " Bjorn Helgaas
2013-08-23 21:46 ` Bjorn Helgaas
-- strict thread matches above, loose matches on Subject: below --
2013-06-19 18:56 Radim Krčmář
2013-06-25 1:38 ` Bjorn Helgaas
2013-06-25 2:58 ` Alex Williamson
2013-06-25 3:35 ` Bjorn Helgaas
2013-06-25 3:57 ` Alex Williamson
2013-06-25 11:23 ` Michael S. Tsirkin
2013-06-25 17:17 ` Bjorn Helgaas
2013-06-25 20:50 ` Radim Krčmář
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=1375970227-14794-1-git-send-email-rkrcmar@redhat.com \
--to=rkrcmar@redhat.com \
--cc=Joe.Lawrence@stratus.com \
--cc=alex.williamson@redhat.com \
--cc=bhelgaas@google.com \
--cc=kaneshige.kenji@jp.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=mst@redhat.com \
--cc=myron.stowe@redhat.com \
--cc=yamahata@valinux.co.jp \
/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;
as well as URLs for NNTP newsgroup(s).