Message ID | 20201030195713.1366341-11-mathieu.poirier@linaro.org (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | remoteproc: Add support for detaching from rproc | expand |
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@linaro.org> > Reviewed-by: Peng Fan <peng.fan@nxp.com> > --- > 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); >
On Mon, Nov 09, 2020 at 10:14:22AM +0100, Arnaud POULIQUEN wrote: > > > 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@linaro.org> > > Reviewed-by: Peng Fan <peng.fan@nxp.com> > > --- > > 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 You are correct > > 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); > >
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) { @@ -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);