lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Wed, 29 Mar 2017 19:04:27 -0400 From: Sinan Kaya <okaya@...eaurora.org> To: linux-pci@...r.kernel.org, timur@...eaurora.org Cc: mayurkumar.patel@...el.com, linux-arm-msm@...r.kernel.org, linux-arm-kernel@...ts.infradead.org, Sinan Kaya <okaya@...eaurora.org>, Bjorn Helgaas <bhelgaas@...gle.com>, Rajat Jain <rajatja@...gle.com>, David Daney <david.daney@...ium.com>, Yinghai Lu <yinghai@...nel.org>, linux-kernel@...r.kernel.org Subject: [PATCH V6 5/5] PCI/ASPM: move link_state cleanup to bridge remove For endpoints, change pcie_aspm_exit_link_state() so it cleans up the device's own state and disables ASPM if necessary, but doesn't remove the parent's link_state. For bridges, change pcie_aspm_exit_link_state() so it frees the bridge's own link_state. Fixes: https://bugzilla.kernel.org/show_bug.cgi?id=194895 Signed-off-by: Sinan Kaya <okaya@...eaurora.org> --- drivers/pci/pcie/aspm.c | 20 +++++++++++++++----- drivers/pci/remove.c | 3 +-- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c index a38602a..37ca9b3 100644 --- a/drivers/pci/pcie/aspm.c +++ b/drivers/pci/pcie/aspm.c @@ -963,6 +963,21 @@ void pcie_aspm_exit_link_state(struct pci_dev *pdev) if (!parent || !parent->link_state) return; + if (pdev->has_secondary_link) { + link = pdev->link_state; + down_read(&pci_bus_sem); + mutex_lock(&aspm_lock); + + list_del(&link->sibling); + list_del(&link->link); + + /* Clock PM is for endpoint device */ + free_link_state(link); + mutex_unlock(&aspm_lock); + up_read(&pci_bus_sem); + return; + } + down_read(&pci_bus_sem); mutex_lock(&aspm_lock); /* @@ -978,11 +993,6 @@ void pcie_aspm_exit_link_state(struct pci_dev *pdev) /* All functions are removed, so just disable ASPM for the link */ pcie_config_aspm_link(link, 0); - list_del(&link->sibling); - list_del(&link->link); - /* Clock PM is for endpoint device */ - free_link_state(link); - /* Recheck latencies and configure upstream links */ if (parent_link) { pcie_update_aspm_capable(root); diff --git a/drivers/pci/remove.c b/drivers/pci/remove.c index 73a03d3..7e14ebd 100644 --- a/drivers/pci/remove.c +++ b/drivers/pci/remove.c @@ -25,8 +25,7 @@ static void pci_stop_dev(struct pci_dev *dev) dev->is_added = 0; } - if (dev->bus->self) - pcie_aspm_exit_link_state(dev); + pcie_aspm_exit_link_state(dev); } static void pci_destroy_dev(struct pci_dev *dev) -- 1.9.1
Powered by blists - more mailing lists