Fix for pcie_aspm_init_link_state crash (rhbz 1418858)

This commit is contained in:
Laura Abbott 2017-02-02 14:56:44 -08:00
parent ab7079edfb
commit fe55255b50
2 changed files with 97 additions and 1 deletions

View File

@ -0,0 +1,90 @@
From patchwork Mon Jan 30 15:23:24 2017
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Subject: PCI/ASPM: Handle PCI-to-PCIe bridges as roots of PCIe hierarchies
From: Bjorn Helgaas <bhelgaas@google.com>
X-Patchwork-Id: 9545603
Message-Id: <20170130152324.32437.37400.stgit@bhelgaas-glaptop.roam.corp.google.com>
To: linux-pci@vger.kernel.org
Cc: Jao Ching Chen <jcchen@pericom.com>, lists@ssl-mail.com,
linux-kernel@vger.kernel.org, Blake Moore <blake.moore@men.de>,
Takashi Iwai <tiwai@suse.com>
Date: Mon, 30 Jan 2017 09:23:24 -0600
In a struct pcie_link_state, link->root points to the pcie_link_state of
the root of the PCIe hierarchy. For the topmost link, this points to
itself (link->root = link). For others, we copy the pointer from the
parent (link->root = link->parent->root).
Previously we recognized that Root Ports originated PCIe hierarchies, but
we treated PCI/PCI-X to PCIe Bridges as being in the middle of the
hierarchy, and when we tried to copy the pointer from link->parent->root,
there was no parent, and we dereferenced a NULL pointer:
BUG: unable to handle kernel NULL pointer dereference at 0000000000000090
IP: [<ffffffff9e424350>] pcie_aspm_init_link_state+0x170/0x820
Recognize that PCI/PCI-X to PCIe Bridges originate PCIe hierarchies just
like Root Ports do, so link->root for these devices should also point to
itself.
Fixes: 51ebfc92b72b ("PCI: Enumerate switches below PCI-to-PCIe bridges")
Link: https://bugzilla.kernel.org/show_bug.cgi?id=193411
Link: https://bugzilla.opensuse.org/show_bug.cgi?id=1022181
Tested-by: lists@ssl-mail.com
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
CC: stable@vger.kernel.org # v4.2+
---
drivers/pci/pcie/aspm.c | 19 +++++++++++++------
1 file changed, 13 insertions(+), 6 deletions(-)
--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c
index 17ac1dce3286..3dd8bcbb3011 100644
--- a/drivers/pci/pcie/aspm.c
+++ b/drivers/pci/pcie/aspm.c
@@ -532,25 +532,32 @@ static struct pcie_link_state *alloc_pcie_link_state(struct pci_dev *pdev)
link = kzalloc(sizeof(*link), GFP_KERNEL);
if (!link)
return NULL;
+
INIT_LIST_HEAD(&link->sibling);
INIT_LIST_HEAD(&link->children);
INIT_LIST_HEAD(&link->link);
link->pdev = pdev;
- if (pci_pcie_type(pdev) != PCI_EXP_TYPE_ROOT_PORT) {
+
+ /*
+ * Root Ports and PCI/PCI-X to PCIe Bridges are roots of PCIe
+ * hierarchies.
+ */
+ if (pci_pcie_type(pdev) == PCI_EXP_TYPE_ROOT_PORT ||
+ pci_pcie_type(pdev) == PCI_EXP_TYPE_PCIE_BRIDGE) {
+ link->root = link;
+ } else {
struct pcie_link_state *parent;
+
parent = pdev->bus->parent->self->link_state;
if (!parent) {
kfree(link);
return NULL;
}
+
link->parent = parent;
+ link->root = link->parent->root;
list_add(&link->link, &parent->children);
}
- /* Setup a pointer to the root port link */
- if (!link->parent)
- link->root = link;
- else
- link->root = link->parent->root;
list_add(&link->sibling, &link_list);
pdev->link_state = link;

View File

@ -42,7 +42,7 @@ Summary: The Linux kernel
# For non-released -rc kernels, this will be appended after the rcX and
# gitX tags, so a 3 here would become part of release "0.rcX.gitX.3"
#
%global baserelease 200
%global baserelease 201
%global fedora_build %{baserelease}
# base_sublevel is the kernel version we're starting with and patching
@ -639,6 +639,9 @@ Patch854: 0001-x86-efi-always-map-first-physical-page-into-EFI-page.patch
# CVE-2017-2596 rhbz 1417812 1417813
Patch855: kvm-fix-page-struct-leak-in-handle_vmon.patch
# rhbz 1418858
Patch856: PCI-ASPM-Handle-PCI-to-PCIe-bridges-as-roots-of-PCIe-hierarchies.patch
# END OF PATCH DEFINITIONS
%endif
@ -2186,6 +2189,9 @@ fi
#
#
%changelog
* Thu Feb 02 2017 Laura Abbott <labbott@fedoraproject.org> - 4.9.7-201
- Fix for pcie_aspm_init_link_state crash (rhbz 1418858)
* Thu Feb 02 2017 Laura Abbott <labbott@fedoraproject.org> - 4.9.7-200
- Linux v4.9.7