On 10/30/20 8:57 PM, Mathieu Poirier wrote: > Add a return value to function rproc_shutdown() in order to > properly deal with error conditions that may occur. > > Signed-off-by: Mathieu Poirier <mathieu.poirier@xxxxxxxxxx> > Reviewed-by: Peng Fan <peng.fan@xxxxxxx> > --- > drivers/remoteproc/remoteproc_core.c | 13 +++++++++---- > include/linux/remoteproc.h | 2 +- > 2 files changed, 10 insertions(+), 5 deletions(-) > > diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c > index de5a5720d1e8..f58475f6dcab 100644 > --- a/drivers/remoteproc/remoteproc_core.c > +++ b/drivers/remoteproc/remoteproc_core.c > @@ -1869,7 +1869,7 @@ EXPORT_SYMBOL(rproc_boot); > * returns, and users can still use it with a subsequent rproc_boot(), if > * needed. > */ > -void rproc_shutdown(struct rproc *rproc) > +int rproc_shutdown(struct rproc *rproc) > { > struct device *dev = &rproc->dev; > int ret; > @@ -1877,15 +1877,19 @@ void rproc_shutdown(struct rproc *rproc) > ret = mutex_lock_interruptible(&rproc->lock); > if (ret) { > dev_err(dev, "can't lock rproc %s: %d\n", rproc->name, ret); > - return; > + return ret; > } > > - if (rproc->state != RPROC_RUNNING) > + if (rproc->state != RPROC_RUNNING) { > + ret = -EPERM; > goto out; > + } > > /* if the remote proc is still needed, bail out */ > - if (!atomic_dec_and_test(&rproc->power)) > + if (!atomic_dec_and_test(&rproc->power)) { > + ret = -EBUSY; > goto out; > + } > > ret = rproc_stop(rproc, false); > if (ret) { Few lines after in source code rproc_unprepare_device could also be tested Regards, Arnaud > @@ -1907,6 +1911,7 @@ void rproc_shutdown(struct rproc *rproc) > rproc->table_ptr = NULL; > out: > mutex_unlock(&rproc->lock); > + return ret; > } > EXPORT_SYMBOL(rproc_shutdown); > > diff --git a/include/linux/remoteproc.h b/include/linux/remoteproc.h > index 6713faab6959..71d4d4873164 100644 > --- a/include/linux/remoteproc.h > +++ b/include/linux/remoteproc.h > @@ -655,7 +655,7 @@ rproc_of_resm_mem_entry_init(struct device *dev, u32 of_resm_idx, size_t len, > u32 da, const char *name, ...); > > int rproc_boot(struct rproc *rproc); > -void rproc_shutdown(struct rproc *rproc); > +int rproc_shutdown(struct rproc *rproc); > int rproc_detach(struct rproc *rproc); > void rproc_report_crash(struct rproc *rproc, enum rproc_crash_type type); > int rproc_coredump_add_segment(struct rproc *rproc, dma_addr_t da, size_t size); >