[alsa-devel] [PATCH v2] ASoC: core: Init pcm runtime work early to avoid warnings

Takashi Iwai tiwai at suse.de
Tue Dec 3 20:10:48 CET 2019


On Tue, 03 Dec 2019 18:30:07 +0100,
Curtis Malainey wrote:
> 
> There are cases where we fail before we reach soc_new_pcm which would
> init the workqueue. When we fail we attempt to flush the queue which
> generates warnings from the workqueue subsystem when we have not inited
> the queue. Solution is to use a proxy function to get around this issue.
> 
> Signed-off-by: Curtis Malainey <cujomalainey at chromium.org>
> Cc: Takashi Iwai <tiwai at suse.de>
> Signed-off-by: Curtis Malainey <cujomalainey at chromium.org>

Doubly sign-off.

Other than that, looks good to me:
Reviewed-by: Takashi Iwai <tiwai at suse.de>


I'm going to submit the remaining fix for the uninitialized list later
on top of this.


Thanks!

Takashi

> ---
>  include/sound/soc.h      |  1 +
>  sound/soc/soc-compress.c |  6 ++----
>  sound/soc/soc-core.c     | 10 ++++++++++
>  sound/soc/soc-pcm.c      | 11 ++++-------
>  4 files changed, 17 insertions(+), 11 deletions(-)
> 
> diff --git a/include/sound/soc.h b/include/sound/soc.h
> index c28a1ed5e8df9..2628967998264 100644
> --- a/include/sound/soc.h
> +++ b/include/sound/soc.h
> @@ -1150,6 +1150,7 @@ struct snd_soc_pcm_runtime {
>  	unsigned int num_codecs;
>  
>  	struct delayed_work delayed_work;
> +	void (*close_delayed_work_func)(struct snd_soc_pcm_runtime *rtd);
>  #ifdef CONFIG_DEBUG_FS
>  	struct dentry *debugfs_dpcm_root;
>  #endif
> diff --git a/sound/soc/soc-compress.c b/sound/soc/soc-compress.c
> index 61f230324164d..6615ef64c7f55 100644
> --- a/sound/soc/soc-compress.c
> +++ b/sound/soc/soc-compress.c
> @@ -214,10 +214,8 @@ static int soc_compr_open_fe(struct snd_compr_stream *cstream)
>   * This is to ensure there are no pops or clicks in between any music tracks
>   * due to DAPM power cycling.
>   */
> -static void close_delayed_work(struct work_struct *work)
> +static void close_delayed_work(struct snd_soc_pcm_runtime *rtd)
>  {
> -	struct snd_soc_pcm_runtime *rtd =
> -			container_of(work, struct snd_soc_pcm_runtime, delayed_work.work);
>  	struct snd_soc_dai *codec_dai = rtd->codec_dai;
>  
>  	mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
> @@ -929,7 +927,7 @@ int snd_soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num)
>  	}
>  
>  	/* DAPM dai link stream work */
> -	INIT_DELAYED_WORK(&rtd->delayed_work, close_delayed_work);
> +	rtd->close_delayed_work_func = close_delayed_work;
>  
>  	rtd->compr = compr;
>  	compr->private_data = rtd;
> diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
> index 062653ab03a37..0e2e628302f1d 100644
> --- a/sound/soc/soc-core.c
> +++ b/sound/soc/soc-core.c
> @@ -435,6 +435,15 @@ static void soc_free_pcm_runtime(struct snd_soc_pcm_runtime *rtd)
>  	device_unregister(rtd->dev);
>  }
>  
> +static void close_delayed_work(struct work_struct *work) {
> +	struct snd_soc_pcm_runtime *rtd =
> +			container_of(work, struct snd_soc_pcm_runtime,
> +				     delayed_work.work);
> +
> +	if (rtd->close_delayed_work_func)
> +		rtd->close_delayed_work_func(rtd);
> +}
> +
>  static struct snd_soc_pcm_runtime *soc_new_pcm_runtime(
>  	struct snd_soc_card *card, struct snd_soc_dai_link *dai_link)
>  {
> @@ -470,6 +479,7 @@ static struct snd_soc_pcm_runtime *soc_new_pcm_runtime(
>  
>  	rtd->dev = dev;
>  	dev_set_drvdata(dev, rtd);
> +	INIT_DELAYED_WORK(&rtd->delayed_work, close_delayed_work);
>  
>  	/*
>  	 * for rtd->codec_dais
> diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
> index 01eb8700c3de5..b78f6ff2b1d3f 100644
> --- a/sound/soc/soc-pcm.c
> +++ b/sound/soc/soc-pcm.c
> @@ -637,10 +637,8 @@ static int soc_pcm_open(struct snd_pcm_substream *substream)
>   * This is to ensure there are no pops or clicks in between any music tracks
>   * due to DAPM power cycling.
>   */
> -static void close_delayed_work(struct work_struct *work)
> +static void close_delayed_work(struct snd_soc_pcm_runtime *rtd)
>  {
> -	struct snd_soc_pcm_runtime *rtd =
> -			container_of(work, struct snd_soc_pcm_runtime, delayed_work.work);
>  	struct snd_soc_dai *codec_dai = rtd->codec_dais[0];
>  
>  	mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass);
> @@ -660,7 +658,7 @@ static void close_delayed_work(struct work_struct *work)
>  	mutex_unlock(&rtd->card->pcm_mutex);
>  }
>  
> -static void codec2codec_close_delayed_work(struct work_struct *work)
> +static void codec2codec_close_delayed_work(struct snd_soc_pcm_runtime *rtd)
>  {
>  	/*
>  	 * Currently nothing to do for c2c links
> @@ -2974,10 +2972,9 @@ int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num)
>  
>  	/* DAPM dai link stream work */
>  	if (rtd->dai_link->params)
> -		INIT_DELAYED_WORK(&rtd->delayed_work,
> -				  codec2codec_close_delayed_work);
> +		rtd->close_delayed_work_func = codec2codec_close_delayed_work;
>  	else
> -		INIT_DELAYED_WORK(&rtd->delayed_work, close_delayed_work);
> +		rtd->close_delayed_work_func = close_delayed_work;
>  
>  	pcm->nonatomic = rtd->dai_link->nonatomic;
>  	rtd->pcm = pcm;
> -- 
> 2.24.0.393.g34dc348eaf-goog
> 


More information about the Alsa-devel mailing list