• Edmund Raile's avatar
    Revert "ALSA: firewire-lib: operate for period elapse event in process context" · 3dab73ab
    Edmund Raile authored
    Commit 7ba5ca32 ("ALSA: firewire-lib: operate for period elapse event
    in process context") removed the process context workqueue from
    amdtp_domain_stream_pcm_pointer() and update_pcm_pointers() to remove
    its overhead.
    
    With RME Fireface 800, this lead to a regression since
    Kernels 5.14.0, causing an AB/BA deadlock competition for the
    substream lock with eventual system freeze under ALSA operation:
    
    thread 0:
        * (lock A) acquire substream lock by
    	snd_pcm_stream_lock_irq() in
    	snd_pcm_status64()
        * (lock B) wait for tasklet to finish by calling
        	tasklet_unlock_spin_wait() in
    	tasklet_disable_in_atomic() in
    	ohci_flush_iso_completions() of ohci.c
    
    thread 1:
        * (lock B) enter tasklet
        * (lock A) attempt to acquire substream lock,
        	waiting for it to be released:
    	snd_pcm_stream_lock_irqsave() in
        	snd_pcm_period_elapsed() in
    	update_pcm_pointers() in
    	process_ctx_payloads() in
    	process_rx_packets() of amdtp-stream.c
    
    ? tasklet_unlock_spin_wait
     </NMI>
     <TASK>
    ohci_flush_iso_completions firewire_ohci
    amdtp_domain_stream_pcm_pointer snd_firewire_lib
    snd_pcm_update_hw_ptr0 snd_pcm
    snd_pcm_status64 snd_pcm
    
    ? native_queued_spin_lock_slowpath
     </NMI>
     <IRQ>
    _raw_spin_lock_irqsave
    snd_pcm_period_elapsed snd_pcm
    process_rx_packets snd_firewire_lib
    irq_target_callback snd_firewire_lib
    handle_it_packet firewire_ohci
    context_tasklet firewire_ohci
    
    Restore the process context work queue to prevent deadlock
    AB/BA deadlock competition for ALSA substream lock of
    snd_pcm_stream_lock_irq() in snd_pcm_status64()
    and snd_pcm_stream_lock_irqsave() in snd_pcm_period_elapsed().
    
    revert commit 7ba5ca32 ("ALSA: firewire-lib: operate for period
    elapse event in process context")
    
    Replace inline description to prevent future deadlock.
    
    Cc: stable@vger.kernel.org
    Fixes: 7ba5ca32 ("ALSA: firewire-lib: operate for period elapse event in process context")
    Reported-by: default avataredmund.raile <edmund.raile@proton.me>
    Closes: https://lore.kernel.org/r/kwryofzdmjvzkuw6j3clftsxmoolynljztxqwg76hzeo4simnl@jn3eo7pe642q/Signed-off-by: default avatarEdmund Raile <edmund.raile@protonmail.com>
    Reviewed-by: default avatarTakashi Sakamoto <o-takashi@sakamocchi.jp>
    Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
    Link: https://patch.msgid.link/20240730195318.869840-3-edmund.raile@protonmail.com
    3dab73ab
amdtp-stream.c 60.6 KB