Re: [alsa-devel] [PATCH] ASoC: dapm: Add locking to snd_soc_dapm_xxxx_pin functions

From: Charles Keepax
Date: Wed Feb 12 2014 - 06:26:49 EST


On Mon, Feb 10, 2014 at 02:05:26PM +0100, Takashi Iwai wrote:
> At Mon, 10 Feb 2014 11:05:36 +0000,
> Charles Keepax wrote:
> >
<snip>
> >
> Actually, this fixes also the double-lock in snd_soc_dapm_sync() call
> in the line below the above. snd_soc_dapm_sync() itself takes
> mutex_lock_nested().

Yeah spotted that as I was going through will do this in a
seperate patch if this one doesn't go in.

<snip>
> > static int arizona_haptics_probe(struct platform_device *pdev)
> > diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
> > index dc8ff13..a44b560 100644
> > --- a/sound/soc/soc-dapm.c
> > +++ b/sound/soc/soc-dapm.c
> > @@ -2325,6 +2325,8 @@ static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
> > {
> > struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true);
> >
> > + mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
> > +
> > if (!w) {
> > dev_err(dapm->dev, "ASoC: DAPM unknown pin %s\n", pin);
> > return -EINVAL;
>
> Missing unlock here.

Good spot thanks, I will update for this.

>
>
> > @@ -2337,6 +2339,8 @@ static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
> > if (status == 0)
> > w->force = 0;
> >
> > + mutex_unlock(&dapm->card->dapm_mutex);
> > +
> > return 0;
> > }
> >
> > @@ -3210,15 +3214,11 @@ int snd_soc_dapm_put_pin_switch(struct snd_kcontrol *kcontrol,
> > struct snd_soc_card *card = snd_kcontrol_chip(kcontrol);
> > const char *pin = (const char *)kcontrol->private_value;
> >
> > - mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
> > -
> > if (ucontrol->value.integer.value[0])
> > snd_soc_dapm_enable_pin(&card->dapm, pin);
> > else
> > snd_soc_dapm_disable_pin(&card->dapm, pin);
> >
> > - mutex_unlock(&card->dapm_mutex);
> > -
> > snd_soc_dapm_sync(&card->dapm);
> > return 0;
> > }
>
> I guess you forgot patching snd_soc_dapm_force_enable_pin()?
> It's now left unprotected after this patch.

Also a good point, thanks I will update.

>
>
> Takashi


Thanks,
Charles
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/