diff options
author | Takashi Iwai <tiwai@suse.de> | 2022-07-28 14:59:42 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2022-08-25 11:11:37 +0200 |
commit | abad59867ac2a7af523335bea7ec7bd1a5b2f3e2 (patch) | |
tree | 907443778c1b1536ae1a9c147c47b6c4656ab253 /include | |
parent | af87a469695dc2b2419b2fdff0bf41db5265b325 (diff) | |
download | linux-stable-abad59867ac2a7af523335bea7ec7bd1a5b2f3e2.tar.gz linux-stable-abad59867ac2a7af523335bea7ec7bd1a5b2f3e2.tar.bz2 linux-stable-abad59867ac2a7af523335bea7ec7bd1a5b2f3e2.zip |
ALSA: core: Add async signal helpers
[ Upstream commit ef34a0ae7a2654bc9e58675e36898217fb2799d8 ]
Currently the call of kill_fasync() from an interrupt handler might
lead to potential spin deadlocks, as spotted by syzkaller.
Unfortunately, it's not so trivial to fix this lock chain as it's
involved with the tasklist_lock that is touched in allover places.
As a temporary workaround, this patch provides the way to defer the
async signal notification in a work. The new helper functions,
snd_fasync_helper() and snd_kill_faync() are replacements for
fasync_helper() and kill_fasync(), respectively. In addition,
snd_fasync_free() needs to be called at the destructor of the relevant
file object.
Link: https://lore.kernel.org/r/20220728125945.29533-2-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'include')
-rw-r--r-- | include/sound/core.h | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/include/sound/core.h b/include/sound/core.h index 4104a9d1001f..9d04e700b855 100644 --- a/include/sound/core.h +++ b/include/sound/core.h @@ -442,4 +442,12 @@ snd_pci_quirk_lookup_id(u16 vendor, u16 device, } #endif +/* async signal helpers */ +struct snd_fasync; + +int snd_fasync_helper(int fd, struct file *file, int on, + struct snd_fasync **fasyncp); +void snd_kill_fasync(struct snd_fasync *fasync, int signal, int poll); +void snd_fasync_free(struct snd_fasync *fasync); + #endif /* __SOUND_CORE_H */ |