Message ID | 3944bede1195f62f887436a3e4150b06894d6e62.1587704308.git.sbobroff@linux.ibm.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | powerpc/eeh: Release EEH device state synchronously | expand |
Context | Check | Description |
---|---|---|
snowpatch_ozlabs/apply_patch | success | Successfully applied on branch powerpc/merge (47e80b4d8b45ae1bd3a1fe8577e95571cb8a976e) |
snowpatch_ozlabs/checkpatch | success | total: 0 errors, 0 warnings, 0 checks, 16 lines checked |
snowpatch_ozlabs/needsstable | success | Patch has no Fixes tags |
Sam Bobroff <sbobroff@linux.ibm.com> writes: > If a device is hot unplgged during EEH recovery, it's possible for the > RTAS call to ibm,configure-pe in pseries_eeh_configure() to return > parameter error (-3), however negative return values are not checked > for and this leads to an infinite loop. > > Fix this by correctly bailing out on negative values. > > Signed-off-by: Sam Bobroff <sbobroff@linux.ibm.com> > --- > arch/powerpc/platforms/pseries/eeh_pseries.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/arch/powerpc/platforms/pseries/eeh_pseries.c b/arch/powerpc/platforms/pseries/eeh_pseries.c > index 893ba3f562c4..9ea1c06a78cd 100644 > --- a/arch/powerpc/platforms/pseries/eeh_pseries.c > +++ b/arch/powerpc/platforms/pseries/eeh_pseries.c > @@ -607,6 +607,8 @@ static int pseries_eeh_configure_bridge(struct eeh_pe *pe) > > if (!ret) > return ret; > + if (ret < 0) > + break; > > /* > * If RTAS returns a delay value that's above 100ms, cut it > @@ -627,7 +629,7 @@ static int pseries_eeh_configure_bridge(struct eeh_pe *pe) > > pr_warn("%s: Unable to configure bridge PHB#%x-PE#%x (%d)\n", > __func__, pe->phb->global_number, pe->addr, ret); > - return ret; > + return rtas_error_rc(ret); See my response to patch #1. I think the best you can do here right now is return -EINVAL for -3, -EIO for any other (unarchitected) negative value.
diff --git a/arch/powerpc/platforms/pseries/eeh_pseries.c b/arch/powerpc/platforms/pseries/eeh_pseries.c index 893ba3f562c4..9ea1c06a78cd 100644 --- a/arch/powerpc/platforms/pseries/eeh_pseries.c +++ b/arch/powerpc/platforms/pseries/eeh_pseries.c @@ -607,6 +607,8 @@ static int pseries_eeh_configure_bridge(struct eeh_pe *pe) if (!ret) return ret; + if (ret < 0) + break; /* * If RTAS returns a delay value that's above 100ms, cut it @@ -627,7 +629,7 @@ static int pseries_eeh_configure_bridge(struct eeh_pe *pe) pr_warn("%s: Unable to configure bridge PHB#%x-PE#%x (%d)\n", __func__, pe->phb->global_number, pe->addr, ret); - return ret; + return rtas_error_rc(ret); } /**
If a device is hot unplgged during EEH recovery, it's possible for the RTAS call to ibm,configure-pe in pseries_eeh_configure() to return parameter error (-3), however negative return values are not checked for and this leads to an infinite loop. Fix this by correctly bailing out on negative values. Signed-off-by: Sam Bobroff <sbobroff@linux.ibm.com> --- arch/powerpc/platforms/pseries/eeh_pseries.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)