Fix for pcie_aspm_init_link_state crash (rhbz 1418858)
This commit is contained in:
parent
ab7079edfb
commit
fe55255b50
|
@ -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;
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue