HomeFreeBSD

sound: Implement asynchronous device detach

Description

sound: Implement asynchronous device detach

Hot-unplugging a sound device, such as a USB sound card, whilst being
consumed by an application, results in an infinite loop until either the
application closes the device's file descriptor, or the channel
automatically times out after hw.snd.timeout seconds. In the case of a
detach however, the timeout approach is still not ideal, since we want
all resources to be released immediatelly, without waiting for N seconds
until we can use the bus again.

The timeout mechanism works by calling chn_sleep() in chn_read() and
chn_write() (see pcm/channel.c) in order to send the thread to sleep,
using cv_timedwait_sig(). Since chn_sleep() sets the CHN_F_SLEEPING flag
while waiting for cv_timedwait_sig() to return, we can test this flag in
pcm_unregister() (called during detach) and wakeup the sleeping
thread(s) to immediately kill the channel(s) being consumed.

Sponsored by: The FreeBSD Foundation
MFC after: 2 months
PR: 194727
Reviewed by: dev_submerge.ch, bapt, markj
Differential Revision: https://reviews.freebsd.org/D43545

(cherry picked from commit 44e128fe9d92c1a544b801cb56e907a66ef34691)

Details

Provenance
christosAuthored on Apr 11 2024, 6:06 PM
Reviewer
dev_submerge.ch
Differential Revision
D43545: sound: Implement asynchronous device detach
Parents
rGe6c51f6db8d7: sound: Get rid of snd_clone and use DEVFS_CDEVPRIV(9)
Branches
Unknown
Tags
Unknown