[alsa-devel] [PATCH v3] ALSA: compress: fix drain calls blocking other compress functions
Takashi Iwai
tiwai at suse.de
Wed Oct 30 17:38:35 CET 2013
At Wed, 30 Oct 2013 21:03:54 +0530,
Vinod Koul wrote:
>
> On Wed, Oct 30, 2013 at 05:24:12PM +0100, Takashi Iwai wrote:
> > 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.
> Okay thanks for pointing out, do you know why we have that
> limitation.
It's a long-standing limitation of POSIX.
Basically a signal handler can accept only very few functions that are
asynchronous-safe. That's the reason why signal is practically
useless in most use cases.
> Btw
> closing the fd should have same effect as free would trigger the stop internally
Well, better to test it before jumping into the conclusion :)
> > You shouldn't code the kernel driver relying on that userspace
> > behavior.
> Ok, will update it
OK.
thanks,
Takashi
More information about the Alsa-devel
mailing list