From: Stephan Gerhold <stephan.gerhold@linaro.org>
To: "François Roux" <info@humanlearning.ch>
Cc: Bjorn Andersson <andersson@kernel.org>,
Mathieu Poirier <mathieu.poirier@linaro.org>,
linux-remoteproc@vger.kernel.org
Subject: Re: [BUG] qcom_q6v5_pas: NULL deref in recovery when using attach-only ops (qcom,broken-reset)
Date: Wed, 12 Aug 2026 15:52:15 +0200 [thread overview]
Message-ID: <anx6j8UX3BzvZ7JN@linaro.org> (raw)
In-Reply-To: <20260811171546.188660-1-info@humanlearning.ch>
On Tue, Aug 11, 2026 at 07:15:46PM +0200, François Roux wrote:
> Running your remoteproc "attach" series on a Surface Pro 12in (X1P42100) at
> EL2, I hit a kernel oops when the CDSP crashed on its own during a long
> build. I was not trying to break anything -- this was a 28-minute kernel
> compile as a stability test, and the DSP failed unprompted.
>
> Reproducer: any remoteproc using qcom_pas_ops_no_reset (i.e. a node with
> qcom,broken-reset) that crashes at runtime. No user action needed.
>
Thanks for the report. Please note that this is a non-upstream change,
so while I appreciate the report we should not ping the upstream
maintainers about it. They have likely never seen the change.
> What happens
> ============
>
> qcom_q6v5_pas 32300000.remoteproc: fatal error received: sleep_statsi.c:537:
> remoteproc remoteproc1: crash detected in cdsp: type fatal error
> remoteproc remoteproc1: handling crash #1 in cdsp
> remoteproc remoteproc1: recovering cdsp
> remoteproc remoteproc1: stopped remote processor cdsp
> Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000
> Mem abort info:
> ESR = 0x0000000086000004
> EC = 0x21: IABT (current EL), IL = 32 bits
> FSC = 0x04: level 0 translation fault
> Internal error: Oops: 0000000086000004 [#1] SMP
> CPU: 3 UID: 0 PID: 82168 Comm: kworker/u34:5 Not tainted 7.1.0-next-20260626 #10
> Hardware name: Microsoft Corporation Surface Pro 12in 1st Ed with Snapdragon
> Workqueue: rproc_recovery_wq rproc_crash_handler_work
> pc : 0x0
> lr : rproc_start+0xc0/0x164
> Call trace:
> rproc_trigger_recovery+0x148/0x164
> rproc_crash_handler_work+0xb4/0xb8
> process_one_work+0x15c/0x29c
> worker_thread+0x18c/0x2e0
> kthread+0x11c/0x13c
> ret_from_fork+0x10/0x20
>
> Analysis
> ========
>
> The link register points at rproc_start+0xc0, and the instruction before it
> is the indirect call:
>
> rproc_start+0xbc: ldr x1, [x0, #16] <- rproc->ops->start
> blr x1 <- x1 == NULL
>
> which is remoteproc_core.c:1292:
>
> ret = rproc->ops->start(rproc);
>
> rproc_start() calls ops->start unconditionally, and qcom_pas_ops_no_reset
> does not provide one:
>
> static const struct rproc_ops qcom_pas_ops_no_reset = {
> .attach = qcom_pas_attach,
> .da_to_va = qcom_pas_da_to_va,
> .stop = qcom_pas_stop,
> .panic = qcom_pas_panic,
> };
>
> The reason that path is reached at all is the branch in
> rproc_trigger_recovery():
>
> if (rproc_has_feature(rproc, RPROC_FEAT_ATTACH_ON_RECOVERY))
> ret = rproc_attach_recovery(rproc);
> else
> ret = rproc_boot_recovery(rproc);
>
> qcom_q6v5_pas.c never calls rproc_set_feature(..., RPROC_FEAT_ATTACH_ON_RECOVERY)
> -- in this tree only imx_rproc.c does. So an attach-only remoteproc takes the
> boot path on recovery, which tries to load firmware and start it, neither of
> which it can do.
>
> Suggested direction (untested)
> ==============================
>
> Setting RPROC_FEAT_ATTACH_ON_RECOVERY when qcom_pas_ops_no_reset is selected
> looks like the natural fix, so recovery goes through rproc_attach_recovery().
> Note that path calls __rproc_detach() first, and .detach is also absent from
> qcom_pas_ops_no_reset -- but __rproc_detach() does check for it and returns
> an error rather than dereferencing NULL, so the failure would at least be
> graceful.
>
We can't recover the remoteproc in this case, because we don't know how
to restart it. Attaching a crashed remoteproc (that is no longer
functional) does not make sense either.
I think we should set rproc->recovery_disabled = true to fix this.
Practically speaking though, the whole qcom,broken-reset approach is
kind of controversial and I'm not sure yet if I will ever post it
upstream in the current state.
Thanks,
Stephan
prev parent reply other threads:[~2026-08-12 13:52 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-11 17:15 [BUG] qcom_q6v5_pas: NULL deref in recovery when using attach-only ops (qcom,broken-reset) François Roux
2026-08-12 13:52 ` Stephan Gerhold [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=anx6j8UX3BzvZ7JN@linaro.org \
--to=stephan.gerhold@linaro.org \
--cc=andersson@kernel.org \
--cc=info@humanlearning.ch \
--cc=linux-remoteproc@vger.kernel.org \
--cc=mathieu.poirier@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.