• Alex Elder's avatar
    remoteproc: use freezable workqueue for crash notifications · 3ad51c17
    Alex Elder authored
    When a remoteproc has crashed, rproc_report_crash() is called to
    handle whatever recovery is desired.  This can happen at almost any
    time, often triggered by an interrupt, though it can also be
    initiated by a write to debugfs file remoteproc/remoteproc*/crash.
    
    When a crash is reported, the crash handler worker is scheduled to
    run (rproc_crash_handler_work()).  One thing that worker does is
    call rproc_trigger_recovery(), which calls rproc_stop().  That calls
    the ->stop method for any remoteproc subdevices before making the
    remote processor go offline.
    
    The Q6V5 modem remoteproc driver implements an SSR subdevice that
    notifies registered drivers when the modem changes operational state
    (prepare, started, stop/crash, unprepared).  The IPA driver
    registers to receive these notifications.
    
    With that as context, I'll now describe the problem.
    
    There was a situation in which buggy modem firmware led to a modem
    crash very soon after system (AP) resume had begun.  The crash caused
    a remoteproc SSR crash notification to be sent to the IPA driver.
    The problem was that, although system resume had begun, it had not
    yet completed, and the IPA driver was still in a suspended state.
    
    This scenario could happen to any driver that registers for these
    SSR notifications, because they are delivered without knowledge of
    the (suspend) state of registered recipient drivers.
    
    This patch offers a simple fix for this, by having the crash
    handling worker function run on the system freezable workqueue.
    This workqueue does not operate if user space is frozen (for
    suspend).  As a result, the SSR subdevice only delivers its
    crash notification when the system is fully operational (i.e.,
    neither suspended nor in suspend/resume transition).
    Tested-by: default avatarSiddharth Gupta <sidgup@codeaurora.org>
    Reviewed-by: default avatarBjorn Andersson <bjorn.andersson@linaro.org>
    Reviewed-by: default avatarMathieu Poirier <mathieu.poirier@linaro>
    Signed-off-by: default avatarAlex Elder <elder@linaro.org>
    Link: https://lore.kernel.org/r/20210519234418.1196387-2-elder@linaro.orgSigned-off-by: default avatarBjorn Andersson <bjorn.andersson@linaro.org>
    3ad51c17
remoteproc_core.c 72.9 KB