mirror of https://gitee.com/openkylin/linux.git
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: Shaohua Li <shaohua.li@intel.com> Signed-off-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
This commit is contained in:
parent
8a339e7321
commit
fc87e919c0
|
@ -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)
|
||||||
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);
|
||||||
|
|
Loading…
Reference in New Issue