[alsa-devel] [PATCH] ASoC: hda: increment codec device refcount when it is added to the card

Takashi Iwai tiwai at suse.de
Fri May 31 08:11:03 CEST 2019


On Thu, 30 May 2019 23:00:10 +0200,
Pierre-Louis Bossart wrote:
> 
> 
> 
> On 5/30/19 3:18 PM, Ranjani Sridharan wrote:
> > Calling snd_device_new() makes the codec devices managed by the card.
> > So, when the card is removed, the refcount for the codec
> > device is decremented and results in the codec device's kobject
> > being cleaned up if the refcount is 0. But, this leads to a NULL
> > pointer exception while attempting to remove the symlinks when the
> > codec driver is released later on. Therefore, increment the codec
> > device's refcount before adding it to the card to prevent this.
> 
> Ranjani, you should add a bit of context for the rest of the list...
> 
> This patch suggest a solution to a set of sightings occurring when
> removing/adding modules in a loop, and the current analysis points to
> a difference between the way the HDMI and HDaudio codecs are handled.
> 
> https://github.com/thesofproject/linux/issues/981
> https://github.com/thesofproject/linux/issues/966
> https://github.com/thesofproject/linux/pull/988
> 
> Since it's not SOF specific it's better to get feedback directly from
> the large ALSA community/maintainers. We probably want to focus on the
> platform-specific/vendor-specific stuff on GitHub and use the mailing
> list for such framework-level changes.

Hm, I still wonder why this doens't happen with the HDA legacy.

What is the shortest way to trigger the bug manually without a script?


thanks,

Takashi


> > Signed-off-by: Ranjani Sridharan <ranjani.sridharan at linux.intel.com>
> > ---
> >   sound/pci/hda/hda_codec.c | 8 ++++++++
> >   1 file changed, 8 insertions(+)
> >
> > diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
> > index b20eb7fc83eb..0d5d95b07e19 100644
> > --- a/sound/pci/hda/hda_codec.c
> > +++ b/sound/pci/hda/hda_codec.c
> > @@ -985,6 +985,14 @@ int snd_hda_codec_device_new(struct hda_bus *bus, struct snd_card *card,
> >   		codec->core.subsystem_id, codec->core.revision_id);
> >   	snd_component_add(card, component);
> >   +	/*
> > +	 * snd_device_new() makes the codec device managed by the card.
> > +	 * When the card is removed, the device reference count is
> > +	 * decremented. Therefore, increment it here to prevent removing
> > +	 * the codec device's kobject when the card is removed.
> > +	 */
> > +	get_device(hda_codec_dev(codec));
> > +
> >   	err = snd_device_new(card, SNDRV_DEV_CODEC, codec, &dev_ops);
> >   	if (err < 0)
> >   		goto error;
> >
> 


More information about the Alsa-devel mailing list