[PATCH alsa-lib 3/3] pcm: direct: Check xrun/suspend before the slave hwptr update

Takashi Iwai tiwai at suse.de
Thu Mar 10 10:59:15 CET 2022


On Thu, 10 Mar 2022 10:35:25 +0100,
S.J. Wang wrote:
> 
> Thanks.
> 
> > 
> > The xrun/suspend may happen at any time and we should check it right
> > before the slave hwptr update.  Otherwise the hwptr value may be screwed
> 
> I think should be "after the slave hwptr update".  If hwptr is screwed,  means
> Suspend happened then check_xrun() can return.
> 
> > and get unexpected large read/write.
> > 
> > Reported-by: S.J. Wang <shengjiu.wang at nxp.com>
> > Signed-off-by: Takashi Iwai <tiwai at suse.de>
> > ---
> >  src/pcm/pcm_dmix.c   | 4 ++--
> >  src/pcm/pcm_dshare.c | 4 ++--
> >  src/pcm/pcm_dsnoop.c | 6 +++---
> >  3 files changed, 7 insertions(+), 7 deletions(-)
> > 
> > diff --git a/src/pcm/pcm_dmix.c b/src/pcm/pcm_dmix.c index
> > d00d53bef604..111fea157228 100644
> > --- a/src/pcm/pcm_dmix.c
> > +++ b/src/pcm/pcm_dmix.c
> > @@ -426,11 +426,11 @@ static int snd_pcm_dmix_sync_ptr(snd_pcm_t
> > *pcm)
> >         snd_pcm_direct_t *dmix = pcm->private_data;
> >         int err;
> > 
> > +       if (dmix->slowptr)
> > +               snd_pcm_hwsync(dmix->spcm);
> >         err = snd_pcm_direct_check_xrun(dmix, pcm);
> >         if (err < 0)
> >                 return err;
> > -       if (dmix->slowptr)
> > -               snd_pcm_hwsync(dmix->spcm);
> > 
> >         return snd_pcm_dmix_sync_ptr0(pcm, *dmix->spcm->hw.ptr);  } diff --
> 
> Better to get slave_hw_ptr before check_xrun(), like this:
> 
> --- a/src/pcm/pcm_dmix.c
> +++ b/src/pcm/pcm_dmix.c
> @@ -424,15 +424,17 @@ static int snd_pcm_dmix_sync_ptr0(snd_pcm_t *pcm, snd_pcm_uframes_t slave_hw_ptr
>  static int snd_pcm_dmix_sync_ptr(snd_pcm_t *pcm)
>  {
>         snd_pcm_direct_t *dmix = pcm->private_data;
> +       snd_pcm_uframes_t slave_hw_ptr;
>         int err;
> 
>         if (dmix->slowptr)
>                 snd_pcm_hwsync(dmix->spcm);
> +       slave_hw_ptr = *dmix->spcm->hw.ptr;
>         err = snd_pcm_direct_check_xrun(dmix, pcm);
>         if (err < 0)
>                 return err;
> 
> -       return snd_pcm_dmix_sync_ptr0(pcm, *dmix->spcm->hw.ptr);
> +       return snd_pcm_dmix_sync_ptr0(pcm, slave_hw_ptr);
>  }

Makes sense.  I'll respin v2 with those changes.


thanks,

Takashi


More information about the Alsa-devel mailing list