• Takashi Iwai's avatar
    ALSA: timer: Handle disconnection more safely · 230323da
    Takashi Iwai authored
    Currently ALSA timer device doesn't take the disconnection into
    account very well; it merely unlinks the timer device at disconnection
    callback but does nothing else.  Because of this, when an application
    accessing the timer device is disconnected, it may release the
    resource before actually closed.  In most cases, it results in a
    warning message indicating a leftover timer instance like:
       ALSA: timer xxxx is busy?
    But basically this is an open race.
    
    This patch tries to address it.  The strategy is like other ALSA
    devices: namely,
    - Manage card's refcount at each open/close
    - Wake up the pending tasks at disconnection
    - Check the shutdown flag appropriately at each possible call
    
    Note that this patch has one ugly hack to handle the wakeup of pending
    tasks.  It'd be cleaner to introduce a new disconnect op to
    snd_timer_instance ops.  But since it would lead to internal ABI
    breakage and it eventually increase my own work when backporting to
    stable kernels, I took a different path to implement locally in
    timer.c.  A cleanup patch will follow at next for 4.5 kernel.
    
    Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=109431
    Cc: <stable@vger.kernel.org> # v3.15+
    Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
    230323da
timer.c 52.5 KB