Message ID | 20191203173007.46504-1-cujomalainey@chromium.org (mailing list archive) |
---|---|
State | Accepted |
Commit | 4bf2e385aa59c2fae5f880aa25cfd2b470109093 |
Headers | show |
Series | [v2] ASoC: core: Init pcm runtime work early to avoid warnings | expand |
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 >
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;