• Alex Elder's avatar
    net: ipa: kill ipa_cmd_pipeline_clear() · e4e9bfb7
    Alex Elder authored
    Calling ipa_cmd_pipeline_clear() after stopping the channel
    underlying the AP<-modem RX endpoint can lead to a deadlock.
    
    This occurs in the ->runtime_suspend device power operation for the
    IPA driver.  While this callback is in progress, any other requests
    for power will block until the callback returns.
    
    Stopping the AP<-modem RX channel does not prevent the modem from
    sending another packet to this endpoint.  If a packet arrives for an
    RX channel when the channel is stopped, an SUSPEND IPA interrupt
    condition will be pending.  Handling an IPA interrupt requires
    power, so ipa_isr_thread() calls pm_runtime_get_sync() first thing.
    
    The problem occurs because a "pipeline clear" command will not
    complete while such a SUSPEND interrupt condition exists.  So the
    SUSPEND IPA interrupt handler won't proceed until it gets power;
    that won't happen until the ->runtime_suspend callback (and its
    "pipeline clear" command) completes; and that can't happen while
    the SUSPEND interrupt condition exists.
    
    It turns out that in this case there is no need to use the "pipeline
    clear" command.  There are scenarios in which clearing the pipeline
    is required while suspending, but those are not (yet) supported
    upstream.  So a simple fix, avoiding the potential deadlock, is to
    stop calling ipa_cmd_pipeline_clear() in ipa_endpoint_suspend().
    This removes the only user of ipa_cmd_pipeline_clear(), so get rid
    of that function.  It can be restored again whenever it's needed.
    
    This is basically a manual revert along with an explanation for
    commit 6cb63ea6 ("net: ipa: introduce ipa_cmd_tag_process()").
    
    Fixes: 6cb63ea6 ("net: ipa: introduce ipa_cmd_tag_process()")
    Signed-off-by: default avatarAlex Elder <elder@linaro.org>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    e4e9bfb7
ipa_cmd.h 5.64 KB