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

Pierre-Louis Bossart pierre-louis.bossart at linux.intel.com
Thu May 30 23:00:10 CEST 2019



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.

> 
> 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