[PATCH] misc: fastrpc: Ignore unsolicited DSP response sentinel
From: Shawn Guo
Date: Mon Jul 27 2026 - 09:24:45 EST
The DSP firmware on Nord targets emits an unsolicited glink message
during process teardown whose context field holds a fixed sentinel
(0xABCDABCD) rather than the context of an outstanding invocation.
fastrpc_rpmsg_callback() treats every inbound message as an invoke
response, so the sentinel is masked and shifted like any real response
((0xABCDABCD & 0xFF0) >> 4 == 188) and looked up in the channel's
context idr.
This is not merely cosmetic. In the common case idr slot 188 is empty,
the lookup fails, and the driver only logs a spurious "No context ID
matches response" error on every teardown. But the context idr is shared
by every protection domain and the listener thread on the channel and is
filled cyclically over [1, FASTRPC_CTX_MAX]. If slot 188 holds a live
context when the sentinel arrives, the sentinel's return value is written
into that unrelated in-flight invocation and it is completed early. That
is a latent, timing-dependent bug that just does not happen to trigger in
current test runs.
Drop the sentinel before it is ever turned into a context lookup.
This removes both the log spam and the mis-completion race. A genuine
response can never be masked: a real context is (idr_index << 4) | pd
(at most 0xFF3) and can never equal the sentinel.
Lemans and other targets are unaffected: their DSP firmware does not send
this message, so the new check never fires.
Assisted-by: Claude:claude-opus-4-8
Signed-off-by: Shawn Guo <shengchao.guo@xxxxxxxxxxxxxxxx>
---
drivers/misc/fastrpc.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
index d86e79134c68..be9f102690f6 100644
--- a/drivers/misc/fastrpc.c
+++ b/drivers/misc/fastrpc.c
@@ -38,6 +38,15 @@
#define FASTRPC_INIT_HANDLE 1
#define FASTRPC_DSP_UTILITIES_HANDLE 2
#define FASTRPC_CTXID_MASK (0xFF0)
+
+/*
+ * DSP firmware on some targets (e.g. the Nord remoteproc) sends an unsolicited
+ * message during process teardown that carries this sentinel in the context
+ * field instead of the context of an outstanding invocation. It is not a
+ * response, so it must be dropped rather than matched against the context idr.
+ */
+#define FASTRPC_RSP_CTX_SENTINEL 0xABCDABCD
+
#define INIT_FILELEN_MAX (2 * 1024 * 1024)
#define INIT_FILE_NAMELEN_MAX (128)
#define FASTRPC_DEVICE_NAME "fastrpc"
@@ -2552,6 +2561,14 @@ static int fastrpc_rpmsg_callback(struct rpmsg_device *rpdev, void *data,
if (!cctx)
return -ENODEV;
+ /*
+ * A sentinel context marks an unsolicited message from the DSP rather
+ * than a response to an outstanding invocation. Drop it: a real context
+ * is (idr_index << 4) | pd and can never collide with this value.
+ */
+ if (rsp->ctx == FASTRPC_RSP_CTX_SENTINEL)
+ return 0;
+
ctxid = ((rsp->ctx & FASTRPC_CTXID_MASK) >> 4);
spin_lock_irqsave(&cctx->lock, flags);
--
2.43.0