summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexey Kardashevskiy <aik@ozlabs.ru>2017-08-29 03:34:03 -0400
committerMichael Ellerman <mpe@ellerman.id.au>2017-08-31 00:26:10 -0400
commit14db3d52d3a214ae8132a403de410af7643cb8b0 (patch)
tree5d1ca8f8e047066d97078049f811d92410849e54
parent405b33a76d26e426276c088b38dc7efba7538ff2 (diff)
powerpc/eeh: Reduce use of pci_dn::node
The pci_dn struct caches a OF device node pointer in order to access the "ibm,loc-code" property when EEH is recovering. However, when this happens in eeh_dev_check_failure(), we also have a pci_dev pointer which should have a valid pointer to the device node when pci_dn has one (both pointers are not NULL for physical functions and are NULL for virtual functions). This changes pci_remove_device_node_info() to look for a parent of the node being removed, just like pci_add_device_node_info() does when it references the parent node. This is the first step to get rid of pci_dn::node. Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
-rw-r--r--arch/powerpc/kernel/eeh.c9
-rw-r--r--arch/powerpc/kernel/pci_dn.c7
2 files changed, 10 insertions, 6 deletions
diff --git a/arch/powerpc/kernel/eeh.c b/arch/powerpc/kernel/eeh.c
index 66c98c158ee3..9e816787c0d4 100644
--- a/arch/powerpc/kernel/eeh.c
+++ b/arch/powerpc/kernel/eeh.c
@@ -435,7 +435,7 @@ int eeh_dev_check_failure(struct eeh_dev *edev)
435 int ret; 435 int ret;
436 int active_flags = (EEH_STATE_MMIO_ACTIVE | EEH_STATE_DMA_ACTIVE); 436 int active_flags = (EEH_STATE_MMIO_ACTIVE | EEH_STATE_DMA_ACTIVE);
437 unsigned long flags; 437 unsigned long flags;
438 struct pci_dn *pdn; 438 struct device_node *dn;
439 struct pci_dev *dev; 439 struct pci_dev *dev;
440 struct eeh_pe *pe, *parent_pe, *phb_pe; 440 struct eeh_pe *pe, *parent_pe, *phb_pe;
441 int rc = 0; 441 int rc = 0;
@@ -493,9 +493,10 @@ int eeh_dev_check_failure(struct eeh_dev *edev)
493 if (pe->state & EEH_PE_ISOLATED) { 493 if (pe->state & EEH_PE_ISOLATED) {
494 pe->check_count++; 494 pe->check_count++;
495 if (pe->check_count % EEH_MAX_FAILS == 0) { 495 if (pe->check_count % EEH_MAX_FAILS == 0) {
496 pdn = eeh_dev_to_pdn(edev); 496 dn = pci_device_to_OF_node(dev);
497 if (pdn->node) 497 if (dn)
498 location = of_get_property(pdn->node, "ibm,loc-code", NULL); 498 location = of_get_property(dn, "ibm,loc-code",
499 NULL);
499 printk(KERN_ERR "EEH: %d reads ignored for recovering device at " 500 printk(KERN_ERR "EEH: %d reads ignored for recovering device at "
500 "location=%s driver=%s pci addr=%s\n", 501 "location=%s driver=%s pci addr=%s\n",
501 pe->check_count, 502 pe->check_count,
diff --git a/arch/powerpc/kernel/pci_dn.c b/arch/powerpc/kernel/pci_dn.c
index 0256372b72de..dfb107631116 100644
--- a/arch/powerpc/kernel/pci_dn.c
+++ b/arch/powerpc/kernel/pci_dn.c
@@ -342,6 +342,7 @@ EXPORT_SYMBOL_GPL(pci_add_device_node_info);
342void pci_remove_device_node_info(struct device_node *dn) 342void pci_remove_device_node_info(struct device_node *dn)
343{ 343{
344 struct pci_dn *pdn = dn ? PCI_DN(dn) : NULL; 344 struct pci_dn *pdn = dn ? PCI_DN(dn) : NULL;
345 struct device_node *parent;
345#ifdef CONFIG_EEH 346#ifdef CONFIG_EEH
346 struct eeh_dev *edev = pdn_to_eeh_dev(pdn); 347 struct eeh_dev *edev = pdn_to_eeh_dev(pdn);
347 348
@@ -354,8 +355,10 @@ void pci_remove_device_node_info(struct device_node *dn)
354 355
355 WARN_ON(!list_empty(&pdn->child_list)); 356 WARN_ON(!list_empty(&pdn->child_list));
356 list_del(&pdn->list); 357 list_del(&pdn->list);
357 if (pdn->parent) 358
358 of_node_put(pdn->parent->node); 359 parent = of_get_parent(dn);
360 if (parent)
361 of_node_put(parent);
359 362
360 dn->data = NULL; 363 dn->data = NULL;
361 kfree(pdn); 364 kfree(pdn);