diff --git a/PCI-ASPM-Handle-PCI-to-PCIe-bridges-as-roots-of-PCIe-hierarchies.patch b/PCI-ASPM-Handle-PCI-to-PCIe-bridges-as-roots-of-PCIe-hierarchies.patch new file mode 100644 index 000000000..a76639e6a --- /dev/null +++ b/PCI-ASPM-Handle-PCI-to-PCIe-bridges-as-roots-of-PCIe-hierarchies.patch @@ -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 +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 , lists@ssl-mail.com, + linux-kernel@vger.kernel.org, Blake Moore , + Takashi Iwai +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: [] 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 +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; diff --git a/kernel.spec b/kernel.spec index 2dffe2e10..14e395768 100644 --- a/kernel.spec +++ b/kernel.spec @@ -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 100 +%global baserelease 101 %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 @@ -2168,6 +2171,9 @@ fi # # %changelog +* Thu Feb 02 2017 Laura Abbott - 4.9.7-101 +- Fix for pcie_aspm_init_link_state crash (rhbz 1418858) + * Thu Feb 02 2017 Laura Abbott - 4.9.7-100 - Linux v4.9.7