Synchronize access to eeh_pe.

Signed-off-by: Sam Bobroff <sbobr...@linux.ibm.com>
---
 arch/powerpc/kernel/eeh_pe.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/arch/powerpc/kernel/eeh_pe.c b/arch/powerpc/kernel/eeh_pe.c
index b89ed46f14e6..0486d3c6ff20 100644
--- a/arch/powerpc/kernel/eeh_pe.c
+++ b/arch/powerpc/kernel/eeh_pe.c
@@ -469,10 +469,12 @@ struct eeh_pe *eeh_pe_find(struct pci_controller *phb,
  * The whole PEs existing in the system are organized as hierarchy
  * tree. The function is used to retrieve the parent PE according
  * to the parent EEH device.
+ * Returns a referenced PE.
  */
 static struct eeh_pe *eeh_pe_get_parent(struct eeh_dev *edev)
 {
        struct eeh_dev *parent;
+       struct eeh_pe *pe;
        struct pci_dn *pdn = eeh_dev_to_pdn(edev);
 
        /*
@@ -490,8 +492,14 @@ static struct eeh_pe *eeh_pe_get_parent(struct eeh_dev 
*edev)
                if (!parent)
                        return NULL;
 
-               if (parent->pe)
-                       return parent->pe;
+               if (parent->pe) {
+                       /* TODO: Unsafe until eeh_dev can be synchronized
+                        * with eeh_pe.
+                        */
+                       pe = parent->pe;
+                       eeh_get_pe(pe);
+                       return pe;
+               }
 
                pdn = pdn->parent;
        }
-- 
2.22.0.216.g00a2a96fc9

Reply via email to