Skip to content
  • Takashi Sakamoto's avatar
    ALSA: firewire-lib: permit to flush queued packets only in process context for... · 1dba9db0
    Takashi Sakamoto authored
    ALSA: firewire-lib: permit to flush queued packets only in process context for better PCM period granularity
    
    These three commits were merged to improve PCM pointer granularity.
    commit 76fb8789 ("ALSA: firewire-lib: taskletize the snd_pcm_period_elapsed() call")
    commit e9148ddd ("ALSA: firewire-lib: flush completed packets when reading PCM position")
    commit 92b862c7
    
     ("ALSA: firewire-lib: optimize packet flushing")
    
    The point of them is to handle queued packets not only in software IRQ
    context of IR/IT contexts, but also in process context. As a result of
    handling packets, period tasklet is scheduled when acrossing PCM period
    boundary. This is to prevent recursive call of
    'struct snd_pcm_ops.pointer()' in the same context.
    
    When the pointer callback is executed in the process context, it's
    better to avoid the second callback in the software IRQ context. The
    software IRQ context runs immediately after scheduled in the process
    context because few packets are queued yet.
    
    For the aim, 'pointer_flush' is used, however it causes a race condition
    between the process context and software IRQ context of IR/IT contexts.
    
    Practically, this race is not so critical because it influences process
    context to skip flushing queued packet and to get worse granularity of
    PCM pointer. The race condition is quite rare but it should be improved
    for stable service.
    
    The similar effect can be achieved by using 'in_interrupt()' macro. This
    commit obsoletes 'pointer_flush' with it.
    
    Acked-by: default avatarClemens Ladisch <clemens@ladisch.de>
    Signed-off-by: default avatarTakashi Sakamoto <o-takashi@sakamocchi.jp>
    Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
    1dba9db0