[PATCH] ASoC: SOF: fix uninitialised "work" with VirtIO

Sridharan, Ranjani ranjani.sridharan at intel.com
Fri Mar 20 17:31:50 CET 2020


On Fri, Mar 20, 2020 at 5:36 AM Guennadi Liakhovetski <
guennadi.liakhovetski at linux.intel.com> wrote:

> In the VirtIO case the sof_pcm_open() function isn't called on the
> host during guest streaming, which then leaves "work" structures
> uninitialised. However it is then used to handle position update
> messages from the DSP. Move their initialisation to immediately after
> allocation of the containing structure.
>
> Signed-off-by: Guennadi Liakhovetski <
> guennadi.liakhovetski at linux.intel.com>
> ---
>
> This is a re-send of "[PATCH 08/14] ASoC: SOF: fix uninitialised "work"
> with VirtIO" as suggested by Mark, also taking into account a comment
> from Ranjani - thanks. Note: I haven't sent patches before from mutt,
> hope this will work, if not - will have to re-send.
>
>  sound/soc/sof/pcm.c       |  4 +---
>  sound/soc/sof/sof-audio.h |  3 +++
>  sound/soc/sof/topology.c  | 17 ++++++++++++-----
>  3 files changed, 16 insertions(+), 8 deletions(-)
>
> diff --git a/sound/soc/sof/pcm.c b/sound/soc/sof/pcm.c
> index f4769e1..47cd741 100644
> --- a/sound/soc/sof/pcm.c
> +++ b/sound/soc/sof/pcm.c
> @@ -57,7 +57,7 @@ static int sof_pcm_dsp_params(struct snd_sof_pcm *spcm,
> struct snd_pcm_substream
>  /*
>   * sof pcm period elapse work
>   */
> -static void sof_pcm_period_elapsed_work(struct work_struct *work)
> +void snd_sof_pcm_period_elapsed_work(struct work_struct *work)
>  {
>         struct snd_sof_pcm_stream *sps =
>                 container_of(work, struct snd_sof_pcm_stream,
> @@ -475,8 +475,6 @@ static int sof_pcm_open(struct snd_soc_component
> *component,
>         dev_dbg(component->dev, "pcm: open stream %d dir %d\n",
>                 spcm->pcm.pcm_id, substream->stream);
>
> -       INIT_WORK(&spcm->stream[substream->stream].period_elapsed_work,
> -                 sof_pcm_period_elapsed_work);
>
>         caps = &spcm->pcm.caps[substream->stream];
>
> diff --git a/sound/soc/sof/sof-audio.h b/sound/soc/sof/sof-audio.h
> index eacd10e..bf65f31a 100644
> --- a/sound/soc/sof/sof-audio.h
> +++ b/sound/soc/sof/sof-audio.h
> @@ -11,6 +11,8 @@
>  #ifndef __SOUND_SOC_SOF_AUDIO_H
>  #define __SOUND_SOC_SOF_AUDIO_H
>
> +#include <linux/workqueue.h>
> +
>  #include <sound/soc.h>
>  #include <sound/control.h>
>  #include <sound/sof/stream.h> /* needs to be included before control.h */
> @@ -189,6 +191,7 @@ struct snd_sof_pcm *snd_sof_find_spcm_comp(struct
> snd_soc_component *scomp,
>  struct snd_sof_pcm *snd_sof_find_spcm_pcm_id(struct snd_soc_component
> *scomp,
>                                              unsigned int pcm_id);
>  void snd_sof_pcm_period_elapsed(struct snd_pcm_substream *substream);
> +void snd_sof_pcm_period_elapsed_work(struct work_struct *work);
>
>  /*
>   * Mixer IPC
> diff --git a/sound/soc/sof/topology.c b/sound/soc/sof/topology.c
> index 058de94..fe8ba3e 100644
> --- a/sound/soc/sof/topology.c
> +++ b/sound/soc/sof/topology.c
> @@ -9,6 +9,7 @@
>  //
>
>  #include <linux/firmware.h>
> +#include <linux/workqueue.h>
>  #include <sound/tlv.h>
>  #include <sound/pcm_params.h>
>  #include <uapi/sound/sof/tokens.h>
> @@ -2448,7 +2449,7 @@ static int sof_dai_load(struct snd_soc_component
> *scomp, int index,
>         struct snd_soc_tplg_stream_caps *caps;
>         struct snd_soc_tplg_private *private = &pcm->priv;
>         struct snd_sof_pcm *spcm;
> -       int stream = SNDRV_PCM_STREAM_PLAYBACK;
> +       int stream;
>         int ret = 0;
>
>         /* nothing to do for BEs atm */
> @@ -2460,8 +2461,12 @@ static int sof_dai_load(struct snd_soc_component
> *scomp, int index,
>                 return -ENOMEM;
>
>         spcm->scomp = scomp;
> -       spcm->stream[SNDRV_PCM_STREAM_PLAYBACK].comp_id =
> COMP_ID_UNASSIGNED;
> -       spcm->stream[SNDRV_PCM_STREAM_CAPTURE].comp_id =
> COMP_ID_UNASSIGNED;
> +
> +       for_each_pcm_streams(stream) {
> +               spcm->stream[stream].comp_id = COMP_ID_UNASSIGNED;
> +               INIT_WORK(&spcm->stream[stream].period_elapsed_work,
> +                         snd_sof_pcm_period_elapsed_work);
> +       }
>
>         spcm->pcm = *pcm;
>         dev_dbg(scomp->dev, "tplg: load pcm %s\n", pcm->dai_name);
> @@ -2482,8 +2487,10 @@ static int sof_dai_load(struct snd_soc_component
> *scomp, int index,
>         if (!spcm->pcm.playback)
>                 goto capture;
>
> +       stream = SNDRV_PCM_STREAM_PLAYBACK;
> +
>         dev_vdbg(scomp->dev, "tplg: pcm %s stream tokens: playback
> d0i3:%d\n",
> -                spcm->pcm.pcm_name, spcm->stream[0].d0i3_compatible);
> +                spcm->pcm.pcm_name, spcm->stream[stream].d0i3_compatible);
>
Hi Guennadi,

This cleanup is unrelated to the commit message (and the one below)? Should
it be a separate patch?

Thanks,
Ranjani


More information about the Alsa-devel mailing list