Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+9 −8
Original line number Original line Diff line number Diff line
@@ -665,16 +665,16 @@ out:
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);