Patch "ALSA: pcm: Allow aborting mutex lock at OSS read/write loops" has been added to the 4.14-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
ALSA: pcm: Allow aborting mutex lock at OSS read/write loops
to the 4.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
alsa-pcm-allow-aborting-mutex-lock-at-oss-read-write-loops.patch
and it can be found in the queue-4.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
900498a34a3ac9c611e9b425094c8106bdd7dc1cMon Sep 17 00:00:00 2001
From: Takashi Iwai <[email protected]>
Date: Mon, 8 Jan 2018 14:03:53 +0100
Subject: ALSA: pcm: Allow aborting mutex lock at OSS read/write loops
From: Takashi Iwai <[email protected]>
commit 900498a34a3ac9c611e9b425094c8106bdd7dc1c upstream.
PCM OSS read/write loops keep taking the mutex lock for the whole read/write, and this might take very long when the exceptionally high amount of data is given. Also, since it invokes with mutex_lock(), the concurrent read/write becomes unbreakable.
This patch tries to address these issues by replacing mutex_lock() with mutex_lock_interruptible(), and also splits / re-takes the lock at each read/write period chunk, so that it can switch the context more finely if requested.
--- sound/core/oss/pcm_oss.c | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-)
sound/core/oss/pcm_oss.c +21 -15
@@ -1334,8 +1334,11 @@ static ssize_t snd_pcm_oss_write1(structif ((tmp =snd_pcm_oss_make_ready (substream)) <0 )return tmp; -mutex_lock (&runtime->oss.params_lock);while (bytes >0 ) { +if (mutex_lock_interruptible (&runtime->oss.params_lock)) { + tmp = -ERESTARTSYS ; +break ; + }if (bytes < runtime->oss.period_bytes || runtime->oss.buffer_used >0 ) { tmp = bytes;if (tmp + runtime->oss.buffer_used > runtime->oss.period_bytes)
@@ -1379,18 +1382,18 @@ static ssize_t snd_pcm_oss_write1(struct xfer += tmp;if ((substream->f_flags &O_NONBLOCK ) !=0 && tmp != runtime->oss.period_bytes) -break ; + tmp = -EAGAIN ; } + err: +mutex_unlock (&runtime->oss.params_lock); +if (tmp <0 ) +break ;if (signal_pending (current)) { tmp = -ERESTARTSYS ; - goto err; +break ; } + tmp =0 ; } -mutex_unlock (&runtime->oss.params_lock); -return xfer; - - err: -mutex_unlock (&runtime->oss.params_lock);return xfer >0 ? (snd_pcm_sframes_t )xfer : tmp; }
@@ -1438,8 +1441,11 @@ static ssize_t snd_pcm_oss_read1(structif ((tmp =snd_pcm_oss_make_ready (substream)) <0 )return tmp; -mutex_lock (&runtime->oss.params_lock);while (bytes >0 ) { +if (mutex_lock_interruptible (&runtime->oss.params_lock)) { + tmp = -ERESTARTSYS ; +break ; + }if (bytes < runtime->oss.period_bytes || runtime->oss.buffer_used >0 ) {if (runtime->oss.buffer_used ==0 ) { tmp =snd_pcm_oss_read2 (substream, runtime->oss.buffer, runtime->oss.period_bytes,1 );
@@ -1470,16 +1476,16 @@ static ssize_t snd_pcm_oss_read1(struct bytes -= tmp; xfer += tmp; } + err: +mutex_unlock (&runtime->oss.params_lock); +if (tmp <0 ) +break ;if (signal_pending (current)) { tmp = -ERESTARTSYS ; - goto err; +break ; } + tmp =0 ; } -mutex_unlock (&runtime->oss.params_lock); -return xfer; - - err: -mutex_unlock (&runtime->oss.params_lock);return xfer >0 ? (snd_pcm_sframes_t )xfer : tmp; }
Patches currently in stable-queue which might be from [email protected] are
queue-4.14/alsa-pcm-remove-incorrect-snd_bug_on-usages.patch queue-4.14/alsa-aloop-fix-inconsistent-format-due-to-incomplete-rule.patch queue-4.14/alsa-pcm-workaround-for-weird-pulseaudio-behavior-on-rewind-error.patch queue-4.14/alsa-pcm-add-missing-error-checks-in-oss-emulation-plugin-builder.patch queue-4.14/alsa-pcm-abort-properly-at-pending-signal-in-oss-read-write-loops.patch queue-4.14/alsa-pcm-allow-aborting-mutex-lock-at-oss-read-write-loops.patch queue-4.14/alsa-aloop-fix-racy-hw-constraints-adjustment.patch queue-4.14/alsa-aloop-release-cable-upon-open-error-path.patch