Message ID | 20250401140402.3676049-1-peng.fan@oss.nxp.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | [V2] remoteproc: imx_rproc: Add mutex protection for workqueue | expand |
On Tue, Apr 01, 2025 at 10:04:02PM +0800, Peng Fan (OSS) wrote: > From: Peng Fan <peng.fan@nxp.com> > > Same as commit 47e6ab07018e ("remoteproc: imx_dsp_rproc: Add mutex > protection for workqueue") and commit 35bdafda40cc ("remoteproc: > stm32_rproc: Add mutex protection for workqueue"), imx_rproc driver > also has similar issue, although no issue reported until now. > > The workqueue may execute late even after remoteproc is stopped or > stopping, some resources (rpmsg device and endpoint) have been > released in rproc_stop_subdevices(), then rproc_vq_interrupt() > accessing these resources will cause kennel dump. > > Call trace: > virtqueue_add_split > virtqueue_add_inbuf > rpmsg_recv_done > vring_interrupt > rproc_vq_interrupt > imx_rproc_vq_work > process_one_work > worker_thread > kthread > ret_from_fork > > Reviewed-by: Frank Li <Frank.Li@nxp.com> > Signed-off-by: Peng Fan <peng.fan@nxp.com> > --- > > V2: > Add RPROC_ATTACHED check, because i.MX supports remote cores started by > bootloader. > Update commit and add R-b from Frank > > drivers/remoteproc/imx_rproc.c | 6 ++++++ > 1 file changed, 6 insertions(+) > NACK - for the reasons I have explained in "[PATCH V2] remoteproc: core: Clear table_sz when rproc_shutdown" > diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c > index 74299af1d7f1..4819a9e57543 100644 > --- a/drivers/remoteproc/imx_rproc.c > +++ b/drivers/remoteproc/imx_rproc.c > @@ -5,6 +5,7 @@ > > #include <dt-bindings/firmware/imx/rsrc.h> > #include <linux/arm-smccc.h> > +#include <linux/cleanup.h> > #include <linux/clk.h> > #include <linux/err.h> > #include <linux/firmware/imx/sci.h> > @@ -785,6 +786,11 @@ static void imx_rproc_vq_work(struct work_struct *work) > rproc_work); > struct rproc *rproc = priv->rproc; > > + guard(mutex)(&rproc->lock); > + > + if (rproc->state != RPROC_RUNNING && rproc->state != RPROC_ATTACHED) > + return; > + > idr_for_each(&rproc->notifyids, imx_rproc_notified_idr_cb, rproc); > } > > -- > 2.37.1 >
diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c index 74299af1d7f1..4819a9e57543 100644 --- a/drivers/remoteproc/imx_rproc.c +++ b/drivers/remoteproc/imx_rproc.c @@ -5,6 +5,7 @@ #include <dt-bindings/firmware/imx/rsrc.h> #include <linux/arm-smccc.h> +#include <linux/cleanup.h> #include <linux/clk.h> #include <linux/err.h> #include <linux/firmware/imx/sci.h> @@ -785,6 +786,11 @@ static void imx_rproc_vq_work(struct work_struct *work) rproc_work); struct rproc *rproc = priv->rproc; + guard(mutex)(&rproc->lock); + + if (rproc->state != RPROC_RUNNING && rproc->state != RPROC_ATTACHED) + return; + idr_for_each(&rproc->notifyids, imx_rproc_notified_idr_cb, rproc); }