[alsa-devel] [PATCH v3] ALSA: compress: fix drain calls blocking other compress functions

Takashi Iwai tiwai at suse.de
Wed Oct 30 17:24:12 CET 2013


At Wed, 30 Oct 2013 20:48:40 +0530,
Vinod Koul wrote:
> 
> On Wed, Oct 30, 2013 at 05:01:38PM +0100, Takashi Iwai wrote:
>  
> > > > > +static int snd_compress_wait_for_drain(struct snd_compr_stream *stream)
> > > > > +{
> > > > > +	/*
> > > > > +	 * We are called with lock held. So drop the lock while we wait for
> > > > > +	 * drain complete notfication from the driver
> > > > > +	 *
> > > > > +	 * It is expected that driver will notify the drain completion and then
> > > > > +	 * stream will be moved to SETUP state, even if draining resulted in an
> > > > > +	 * error. We can trigger next track after this.
> > > > > +	 */
> > > > > +	stream->runtime->state = SNDRV_PCM_STATE_DRAINING;
> > > > > +	mutex_unlock(&stream->device->lock);
> > > > > +
> > > > > +	wait_event(stream->runtime->wait, stream->runtime->drain_wake);
> > > > 
> > > > Don't you really want the interruption?
> > > > Or use wait_event_interruptible() and return error appropriately.
> > > any interruption from usermode should trigger the compress_stop/compress_free
> > 
> > ... but how?
> > 
> > > which will unblock this. I dont see the need to have interruptible here
> > 
> > Suppose you're running a single thread program.  Then who triggers the
> > stop?
> Your signal catcher which should be registered for signals intrested and then
> calls stop or free. Assuming this should be considered single threaded. IIRC,
> this is how you do in aplay, right?

No, issuing an ioctl in a signal isn't guaranteed to work at all.
You shouldn't code the kernel driver relying on that userspace
behavior.


Takashi


More information about the Alsa-devel mailing list