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

Commit 0ba17888 authored by Gavin Shan's avatar Gavin Shan Committed by Benjamin Herrenschmidt
Browse files

powerpc/eeh: Remove reference to PCI device



We will rely on pcibios_release_device() to remove the EEH cache
and unbind EEH device for the specific PCI device. So we shouldn't
hold the reference to the PCI device from EEH cache and EEH device.
Otherwise, pcibios_release_device() won't be called as we expected.
The patch removes the reference to the PCI device in EEH core.

Signed-off-by: default avatarGavin Shan <shangw@linux.vnet.ibm.com>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent ee1dd1e3
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -499,8 +499,6 @@ unsigned long eeh_check_failure(const volatile void __iomem *token, unsigned lon
	}

	eeh_dev_check_failure(edev);

	pci_dev_put(eeh_dev_to_pci_dev(edev));
	return val;
}

@@ -904,7 +902,6 @@ static void eeh_add_device_late(struct pci_dev *dev)
	}
	WARN_ON(edev->pdev);

	pci_dev_get(dev);
	edev->pdev = dev;
	dev->dev.archdata.edev = edev;

@@ -992,7 +989,6 @@ static void eeh_remove_device(struct pci_dev *dev, int purge_pe)
	}
	edev->pdev = NULL;
	dev->dev.archdata.edev = NULL;
	pci_dev_put(dev);

	eeh_rmv_from_parent_pe(edev, purge_pe);
	eeh_addr_cache_rmv_dev(dev);
+5 −13
Original line number Diff line number Diff line
@@ -68,17 +68,13 @@ static inline struct eeh_dev *__eeh_addr_cache_get_device(unsigned long addr)
		struct pci_io_addr_range *piar;
		piar = rb_entry(n, struct pci_io_addr_range, rb_node);

		if (addr < piar->addr_lo) {
		if (addr < piar->addr_lo)
			n = n->rb_left;
		} else {
			if (addr > piar->addr_hi) {
		else if (addr > piar->addr_hi)
			n = n->rb_right;
			} else {
				pci_dev_get(piar->pcidev);
		else
			return piar->edev;
	}
		}
	}

	return NULL;
}
@@ -156,7 +152,6 @@ eeh_addr_cache_insert(struct pci_dev *dev, unsigned long alo,
	if (!piar)
		return NULL;

	pci_dev_get(dev);
	piar->addr_lo = alo;
	piar->addr_hi = ahi;
	piar->edev = pci_dev_to_eeh_dev(dev);
@@ -250,7 +245,6 @@ restart:

		if (piar->pcidev == dev) {
			rb_erase(n, &pci_io_addr_cache_root.rb_root);
			pci_dev_put(piar->pcidev);
			kfree(piar);
			goto restart;
		}
@@ -302,12 +296,10 @@ void eeh_addr_cache_build(void)
		if (!edev)
			continue;

		pci_dev_get(dev);  /* matching put is in eeh_remove_device() */
		dev->dev.archdata.edev = edev;
		edev->pdev = dev;

		eeh_addr_cache_insert_dev(dev);

		eeh_sysfs_add_device(dev);
	}