]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - rpmsg/rpmsg.git/commitdiff
remoteproc: fix multiple back-to-back error recoveries
authorSuman Anna <s-anna@ti.com>
Fri, 10 Mar 2017 02:35:20 +0000 (20:35 -0600)
committerSuman Anna <s-anna@ti.com>
Mon, 11 Mar 2019 17:00:24 +0000 (12:00 -0500)
The remoteproc core uses a dedicated work item per remote processor
to perform an error recovery of that processor. This work item is
always scheduled upon notification of an error at the moment. The
error recovery process itself is performed when the workqueue gets
scheduled and executes the work function, but an error recovery
needs to be performed only once if there are multiple notifications
while an existing error recovery is in progress. Fix this by adding
a check to make sure the remote processor error recovery work item
is not already running or scheduled.

This fixes an issue with error recovery upon MMU Faults on OMAP
IPU remote processors. An MMU fault on OMAP IPU sends two error
notifications - one a direct interrupt from the MMU, and the second
a mailbox-based crash notification after the remote processor has
collected some backtrace. The mailbox based interrupt mechanism,
added in commit 7f275d21e240 ("remoteproc/omap: report device
exceptions and trigger recovery"), is used for Attribute MMU (AMMU)
faults and other internal exceptions on the IPU. The backtrace
collection on the IPU remote processor is triggered by the same
interrupt which cannot be differentiated between an MMU fault and
an AMMU fault. The remoteproc core changes in 4.9 kernel around the
boot sequences has now caused the second notification to trigger a
secondary error recovery, which was avoided in previous kernels due
to the event detection in the work-function itself. The newer code
sequences changes the timing w.r.t previous kernels where the
recovery process was performed a bit later due to the asynchronous
firmware loading.

Signed-off-by: Suman Anna <s-anna@ti.com>

index 30e02198bb302e3e21a3dbd68b64cdfda7c4e717..9e33dbee6e2045c1ed4755f8356ee65de0e62a2c 100644 (file)
@@ -2037,8 +2037,9 @@ void rproc_report_crash(struct rproc *rproc, enum rproc_crash_type type)
        dev_err(&rproc->dev, "crash detected in %s: type %s\n",
                rproc->name, rproc_crash_to_string(type));
-       /* create a new task to handle the error */
-       schedule_work(&rproc->crash_handler);
+       /* create a new task to handle the error if not scheduled already */
+       if (!work_busy(&rproc->crash_handler))
+               schedule_work(&rproc->crash_handler);