core: snd_card_disconnect/snd_card_free: hang when card unregistered
Takashi Iwai
tiwai at suse.de
Fri May 15 16:35:01 CEST 2020
On Fri, 15 May 2020 15:30:25 +0200,
Dexter Travis wrote:
>
> Takashi,
>
> Thank you. That is helpful. In my case we are embedded deeply enough
> that there is only one application playing sounds so it may be
> possible to improve our user space side to properly close down the
> sound.
>
> When power comes back I do not need to resume playing the previous
> sound. From the kernel side is it possible to force the sound to
> abort or stop?
That can be done by calling snd_pcm_stop(). The function needs the
stream locking. You can use snd_pcm_stop_xrun() instead, although
it's no XRUN, strictly speaking.
> How do more easily removed sound devices handle this? For example a
> USB or other hot-pluggable sound device?
In the case of actually removed device, the whole device is gone, and
at re-plugging, a new device gets created, hence no conflicts between
them. They are two different devices, after all.
Takashi
>
>
>
> Regards,
>
>
> Dexter
>
> On Fri, May 15, 2020 at 2:32 AM Takashi Iwai <tiwai at suse.de> wrote:
> >
> > On Thu, 14 May 2020 23:04:09 +0200,
> > Dexter Travis wrote:
> > >
> > > In my system during certain power events the power rail for the
> > > TLV320AIC3120 goes away and may come back.
> > >
> > > To accommodate this I have added a call to snd_soc_unregister_card as
> > > soon as I notice via GPIO that this power has been removed. I then
> > > call snd_soc_register_card to re-install the sound card after power is
> > > restored.
> > >
> > > If no sound is playing when the asynchronous power removal occurs this
> > > works fine.
> > >
> > > If a sound is playing one of two things will occur. In the first case
> > > the sound driver comes back and sound is restored when power is
> > > restored. In the second case my deferred work function which calls the
> > > snd_soc_unregister_card function gets hung and does not return.
> > >
> > > I have traced the difference to the wait_for_completion call in
> > > snd_card_free. if snd_card_disconnect adds files to shutdown_files
> > > list then wait_for_completion will hang forever.
> > >
> > > Any suggestions on how to further debug this?
> > >
> > > How to force the immediate unregister of the card even if a sound is playing?
> >
> > You can unregister the devices, i.e. they disappear from the
> > user-space. However, the old stream and the belonging objects are
> > still alive, hence you can't release the resources entirely until the
> > user-space closes and drops the remaining one. The completion is
> > waiting for the release of those remaining handles. So, if you try to
> > register again the same objects, it'll conflict.
> >
> > IOW, it'll be really messy if you try to disconnect and release the
> > whole resources temporarily and restore again. I guess the current
> > best would be to limit a part of components somehow during the
> > temporary absence.
> >
> > The temporary stop of a stream isn't well handled in the core API,
> > admittedly, it's a known problem. We're considering to introduce a
> > new state, but it's still under evaluation.
> >
> >
> > thanks,
> >
> > Takashi
>
More information about the Alsa-devel
mailing list