diff options
author | Alexey Kardashevskiy <aik@ozlabs.ru> | 2017-08-29 03:34:03 -0400 |
---|---|---|
committer | Michael Ellerman <mpe@ellerman.id.au> | 2017-08-31 00:26:10 -0400 |
commit | 14db3d52d3a214ae8132a403de410af7643cb8b0 (patch) | |
tree | 5d1ca8f8e047066d97078049f811d92410849e54 | |
parent | 405b33a76d26e426276c088b38dc7efba7538ff2 (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.c | 9 | ||||
-rw-r--r-- | arch/powerpc/kernel/pci_dn.c | 7 |
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); | |||
342 | void pci_remove_device_node_info(struct device_node *dn) | 342 | void 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); |