On Tue, Jun 25, 2019 at 10:27 PM Vaibhav Jain <vaib...@linux.ibm.com> wrote: > > In some cases initial bind of scm memory for an lpar can fail if > previously it wasn't released using a scm-unbind hcall. This situation > can arise due to panic of the previous kernel or forced lpar > fadump. In such cases the H_SCM_BIND_MEM return a H_OVERLAP error. > > To mitigate such cases the patch updates papr_scm_probe() to force a > call to drc_pmem_unbind() in case the initial bind of scm memory fails > with EBUSY error. In case scm-bind operation again fails after the > forced scm-unbind then we follow the existing error path. We also > update drc_pmem_bind() to handle the H_OVERLAP error returned by phyp > and indicate it as a EBUSY error back to the caller. > > Suggested-by: "Oliver O'Halloran" <ooh...@gmail.com> > Signed-off-by: Vaibhav Jain <vaib...@linux.ibm.com> > --- > Change-log: > > v2: > * Moved the retry code from drc_pmem_bind() to papr_scm_probe() > [Oliver] > * Changed the type of variable 'rc' in drc_pmem_bind() to > int64_t. [Oliver] > --- > arch/powerpc/platforms/pseries/papr_scm.c | 15 ++++++++++++++- > 1 file changed, 14 insertions(+), 1 deletion(-) > > diff --git a/arch/powerpc/platforms/pseries/papr_scm.c > b/arch/powerpc/platforms/pseries/papr_scm.c > index a4e1674bb15c..2c90cbe88313 100644 > --- a/arch/powerpc/platforms/pseries/papr_scm.c > +++ b/arch/powerpc/platforms/pseries/papr_scm.c > @@ -43,8 +43,9 @@ struct papr_scm_priv { > static int drc_pmem_bind(struct papr_scm_priv *p) > { > unsigned long ret[PLPAR_HCALL_BUFSIZE]; > - uint64_t rc, token; > uint64_t saved = 0; > + uint64_t token; > + int64_t rc; > > /* > * When the hypervisor cannot map all the requested memory in a single > @@ -64,6 +65,10 @@ static int drc_pmem_bind(struct papr_scm_priv *p) > } while (rc == H_BUSY); > > if (rc) { > + /* H_OVERLAP needs a separate error path */ > + if (rc == H_OVERLAP) > + return -EBUSY; > + > dev_err(&p->pdev->dev, "bind err: %lld\n", rc); > return -ENXIO; > } > @@ -331,6 +336,14 @@ static int papr_scm_probe(struct platform_device *pdev) > > /* request the hypervisor to bind this region to somewhere in memory > */ > rc = drc_pmem_bind(p); > + > + /* If phyp reports drc memory still bound the force unbound and retry > */
"the force" should be "then force"? > + if (rc == -EBUSY) { > + dev_warn(&pdev->dev, "Retrying bind after unbinding\n"); Looks good otherwise, Reviewed-by: Oliver O'Halloran <ooh...@gmail.com>