[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