[PATCH] remoteproc: imx_rproc: Add mutex protection for workqueue

From: Peng Fan (OSS)
Date: Mon Mar 31 2025 - 07:24:13 EST


From: Peng Fan <peng.fan@xxxxxxx>

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.

Reuse the commit log from the fix to imx_dsp_rproc:

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

Signed-off-by: Peng Fan <peng.fan@xxxxxxx>
---
drivers/remoteproc/imx_rproc.c | 6 ++++++
1 file changed, 6 insertions(+)

diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c
index 74299af1d7f1..f933c8f4fc8b 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)
+ return;
+
idr_for_each(&rproc->notifyids, imx_rproc_notified_idr_cb, rproc);
}

--
2.37.1