[alsa-devel] [PATCH v2 1/2] ASoC: core: conditionally increase module refcount on component open

Pierre-Louis Bossart pierre-louis.bossart at linux.intel.com
Fri Apr 5 19:12:53 CEST 2019



On 4/5/19 11:57 AM, Ranjani Sridharan wrote:
> Recently, for Intel platforms the "ignore_module_refcount" field
> was introduced for the component driver. In order to avoid a
> deadlock preventing the PCI modules from being removed
> even when the card was idle, the refcounts were not incremented
> for the device driver module during component probe.
> 
> However, this change introduced a nasty side effect:
> the device driver module can be unloaded while a pcm stream is open.
> 
> This patch proposes to change the field to be renamed as
> "module_get_upon_open". When this field is set, the module
> refcount should be incremented on pcm open amd decremented
> upon pcm close. This will enable modules to be removed
> when no PCM playback/capture happens and prevent removal
> when the component is actually in use.
> 
> Also, align with the skylake component driver with the new name.
> 
> Fixes: b450b878('ASoC: core: don't increase component module refcount
>                   unconditionally'
> 
> Signed-off-by: Ranjani Sridharan <ranjani.sridharan at linux.intel.com>

Both patches 1..2

Acked-by: Pierre-Louis Bossart <pierre-louis.bossart at linux.intel.com>

Thanks for improving and fixing this Ranjani!

> ---
>   include/sound/soc.h               | 9 +++++++--
>   sound/soc/intel/skylake/skl-pcm.c | 2 +-
>   sound/soc/soc-core.c              | 4 ++--
>   3 files changed, 10 insertions(+), 5 deletions(-)
> 
> diff --git a/include/sound/soc.h b/include/sound/soc.h
> index 1e2be35ed36f..482b4ea87c3c 100644
> --- a/include/sound/soc.h
> +++ b/include/sound/soc.h
> @@ -802,8 +802,13 @@ struct snd_soc_component_driver {
>   	int probe_order;
>   	int remove_order;
>   
> -	/* signal if the module handling the component cannot be removed */
> -	unsigned int ignore_module_refcount:1;
> +	/*
> +	 * signal if the module handling the component should not be removed
> +	 * if a pcm is open. Setting this would prevent the module
> +	 * refcount being incremented in probe() but allow it be incremented
> +	 * when a pcm is opened and decremented when it is closed.
> +	 */
> +	unsigned int module_get_upon_open:1;
>   
>   	/* bits */
>   	unsigned int idle_bias_on:1;
> diff --git a/sound/soc/intel/skylake/skl-pcm.c b/sound/soc/intel/skylake/skl-pcm.c
> index 56099db8f86d..ee53d047c3bd 100644
> --- a/sound/soc/intel/skylake/skl-pcm.c
> +++ b/sound/soc/intel/skylake/skl-pcm.c
> @@ -1468,7 +1468,7 @@ static const struct snd_soc_component_driver skl_component  = {
>   	.ops		= &skl_platform_ops,
>   	.pcm_new	= skl_pcm_new,
>   	.pcm_free	= skl_pcm_free,
> -	.ignore_module_refcount = 1, /* do not increase the refcount in core */
> +	.module_get_upon_open = 1, /* increment refcount when a pcm is opened */
>   };
>   
>   int skl_platform_register(struct device *dev)
> diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
> index 6f4842977b8d..e78534bbd092 100644
> --- a/sound/soc/soc-core.c
> +++ b/sound/soc/soc-core.c
> @@ -947,7 +947,7 @@ static void soc_cleanup_component(struct snd_soc_component *component)
>   	snd_soc_dapm_free(snd_soc_component_get_dapm(component));
>   	soc_cleanup_component_debugfs(component);
>   	component->card = NULL;
> -	if (!component->driver->ignore_module_refcount)
> +	if (!component->driver->module_get_upon_open)
>   		module_put(component->dev->driver->owner);
>   }
>   
> @@ -1381,7 +1381,7 @@ static int soc_probe_component(struct snd_soc_card *card,
>   		return 0;
>   	}
>   
> -	if (!component->driver->ignore_module_refcount &&
> +	if (!component->driver->module_get_upon_open &&
>   	    !try_module_get(component->dev->driver->owner))
>   		return -ENODEV;
>   
> 


More information about the Alsa-devel mailing list