Commit fc87e919 authored by Kenji Kaneshige's avatar Kenji Kaneshige Committed by Jesse Barnes

PCI ASPM: fix possible null pointer dereference

Fix possible NULL dereference in pcie_aspm_exit_link_state(). This
patch also cleanup some code.
Acked-by: default avatarShaohua Li <shaohua.li@intel.com>
Signed-off-by: default avatarKenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
parent 8a339e73
...@@ -665,16 +665,16 @@ void pcie_aspm_init_link_state(struct pci_dev *pdev) ...@@ -665,16 +665,16 @@ void pcie_aspm_init_link_state(struct pci_dev *pdev)
void pcie_aspm_exit_link_state(struct pci_dev *pdev) void pcie_aspm_exit_link_state(struct pci_dev *pdev)
{ {
struct pci_dev *parent = pdev->bus->self; struct pci_dev *parent = pdev->bus->self;
struct pcie_link_state *link_state = parent->link_state; struct pcie_link_state *link;
if (aspm_disabled || !pdev->is_pcie || !parent || !link_state) if (aspm_disabled || !pdev->is_pcie || !parent || !parent->link_state)
return; return;
if (parent->pcie_type != PCI_EXP_TYPE_ROOT_PORT && if (parent->pcie_type != PCI_EXP_TYPE_ROOT_PORT &&
parent->pcie_type != PCI_EXP_TYPE_DOWNSTREAM) parent->pcie_type != PCI_EXP_TYPE_DOWNSTREAM)
return; return;
down_read(&pci_bus_sem); down_read(&pci_bus_sem);
mutex_lock(&aspm_lock); mutex_lock(&aspm_lock);
/* /*
* All PCIe functions are in one slot, remove one function will remove * All PCIe functions are in one slot, remove one function will remove
* the whole slot, so just wait until we are the last function left. * the whole slot, so just wait until we are the last function left.
...@@ -682,13 +682,14 @@ void pcie_aspm_exit_link_state(struct pci_dev *pdev) ...@@ -682,13 +682,14 @@ void pcie_aspm_exit_link_state(struct pci_dev *pdev)
if (!list_is_last(&pdev->bus_list, &parent->subordinate->devices)) if (!list_is_last(&pdev->bus_list, &parent->subordinate->devices))
goto out; goto out;
link = parent->link_state;
/* All functions are removed, so just disable ASPM for the link */ /* All functions are removed, so just disable ASPM for the link */
__pcie_aspm_config_one_dev(parent, 0); __pcie_aspm_config_one_dev(parent, 0);
list_del(&link_state->sibling); list_del(&link->sibling);
list_del(&link_state->link); list_del(&link->link);
/* Clock PM is for endpoint device */ /* Clock PM is for endpoint device */
free_link_state(link);
free_link_state(link_state);
out: out:
mutex_unlock(&aspm_lock); mutex_unlock(&aspm_lock);
up_read(&pci_bus_sem); up_read(&pci_bus_sem);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment