On Mon, 2018-01-15 at 13:34 +0100, Greg Kroah-Hartman wrote: > 4.4-stable review patch. If anyone has any objections, please let me know. > > ------------------ > > From: Takashi Iwai <tiwai@xxxxxxx> > > 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. [...] > @@ -1414,18 +1417,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; > } [...] Some of the "goto err" statements in the loop are conditional on tmp <= 0, but if tmp == 0 this will no longer terminate the loop. Is that intentional or a bug? The same for snd_pcm_oss_read1(). Ben. -- Ben Hutchings Software Developer, Codethink Ltd.