alsa-devel.alsa-project.org archive mirror
 help / color / mirror / Atom feed
* [alsa-devel] [PATCH v2] ASoC: core: Init pcm runtime work early to avoid warnings
@ 2019-12-03 17:30 Curtis Malainey
  2019-12-03 19:10 ` Takashi Iwai
  2019-12-04 12:15 ` [alsa-devel] Applied "ASoC: core: Init pcm runtime work early to avoid warnings" to the asoc tree Mark Brown
  0 siblings, 2 replies; 3+ messages in thread
From: Curtis Malainey @ 2019-12-03 17:30 UTC (permalink / raw)
  To: alsa-devel
  Cc: Takashi Iwai, Takashi Iwai, Liam Girdwood, Vinod Koul,
	Mark Brown, Curtis Malainey

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@chromium.org>
Cc: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Curtis Malainey <cujomalainey@chromium.org>
---
 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

_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
https://mailman.alsa-project.org/mailman/listinfo/alsa-devel

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [alsa-devel] [PATCH v2] ASoC: core: Init pcm runtime work early to avoid warnings
  2019-12-03 17:30 [alsa-devel] [PATCH v2] ASoC: core: Init pcm runtime work early to avoid warnings Curtis Malainey
@ 2019-12-03 19:10 ` Takashi Iwai
  2019-12-04 12:15 ` [alsa-devel] Applied "ASoC: core: Init pcm runtime work early to avoid warnings" to the asoc tree Mark Brown
  1 sibling, 0 replies; 3+ messages in thread
From: Takashi Iwai @ 2019-12-03 19:10 UTC (permalink / raw)
  To: Curtis Malainey
  Cc: alsa-devel, Takashi Iwai, Liam Girdwood, Vinod Koul, Mark Brown

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@chromium.org>
> Cc: Takashi Iwai <tiwai@suse.de>
> Signed-off-by: Curtis Malainey <cujomalainey@chromium.org>

Doubly sign-off.

Other than that, looks good to me:
Reviewed-by: Takashi Iwai <tiwai@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
> 
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
https://mailman.alsa-project.org/mailman/listinfo/alsa-devel

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [alsa-devel] Applied "ASoC: core: Init pcm runtime work early to avoid warnings" to the asoc tree
  2019-12-03 17:30 [alsa-devel] [PATCH v2] ASoC: core: Init pcm runtime work early to avoid warnings Curtis Malainey
  2019-12-03 19:10 ` Takashi Iwai
@ 2019-12-04 12:15 ` Mark Brown
  1 sibling, 0 replies; 3+ messages in thread
From: Mark Brown @ 2019-12-04 12:15 UTC (permalink / raw)
  To: Curtis Malainey
  Cc: alsa-devel, Takashi Iwai, Liam Girdwood, Takashi Iwai,
	Vinod Koul, Mark Brown

The patch

   ASoC: core: Init pcm runtime work early to avoid warnings

has been applied to the asoc tree at

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git 

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.  

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark

From 4bf2e385aa59c2fae5f880aa25cfd2b470109093 Mon Sep 17 00:00:00 2001
From: Curtis Malainey <cujomalainey@chromium.org>
Date: Tue, 3 Dec 2019 09:30:07 -0800
Subject: [PATCH] ASoC: core: Init pcm runtime work early to avoid warnings

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@chromium.org>
Reviewed-by: Takashi Iwai <tiwai@suse.de>
Link: https://lore.kernel.org/r/20191203173007.46504-1-cujomalainey@chromium.org
Signed-off-by: Mark Brown <broonie@kernel.org>
---
 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 c28a1ed5e8df..262896799826 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 61f230324164..6615ef64c7f5 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 062653ab03a3..0e2e628302f1 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 01eb8700c3de..b78f6ff2b1d3 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.20.1

_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
https://mailman.alsa-project.org/mailman/listinfo/alsa-devel

^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2019-12-04 12:17 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-12-03 17:30 [alsa-devel] [PATCH v2] ASoC: core: Init pcm runtime work early to avoid warnings Curtis Malainey
2019-12-03 19:10 ` Takashi Iwai
2019-12-04 12:15 ` [alsa-devel] Applied "ASoC: core: Init pcm runtime work early to avoid warnings" to the asoc tree Mark Brown

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).