When a DSP hangs, if a graceful shutdown is attempted during sysmon stop, it times out but sysmon_stop() still returns 0. The stop subdevice loop then continues and tears down the glink and ssr subdevices, which unregisters and unmaps the memory regions attached to rpmsg device. If the remote still has DMA in flight against those regions, the result is an SMMU fault.
Fix sysmon_stop() to return -ETIMEDOUT when a shutdown mechanism was tried but the remote did not acknowledge it. With the abort-on-first- failure behaviour already in rproc_stop_subdevices(), this prevents glink and ssr from running their stop callbacks against an unresponsive remote. Signed-off-by: Mukesh Ojha <[email protected]> --- drivers/remoteproc/qcom_sysmon.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/remoteproc/qcom_sysmon.c b/drivers/remoteproc/qcom_sysmon.c index 44b905a7e129..a29084cf7145 100644 --- a/drivers/remoteproc/qcom_sysmon.c +++ b/drivers/remoteproc/qcom_sysmon.c @@ -559,6 +559,11 @@ static int sysmon_stop(struct rproc_subdev *subdev, bool crashed) sysmon->shutdown_acked = ssctl_request_shutdown(sysmon); else if (sysmon->ept) sysmon->shutdown_acked = sysmon_request_shutdown(sysmon); + else + return 0; + + if (!sysmon->shutdown_acked) + return -ETIMEDOUT; return 0; } -- 2.53.0

