• Takashi Iwai's avatar
    ASoC: pcm: Sync delayed work before releasing resources · 5d61f0ba
    Takashi Iwai authored
    When ASoC driver is unbound dynamically during its operation (i.e. a
    kind of hot-unplug), we may hit Oops due to the resource access after
    the release by a delayed work, something like:
    
      Unable to handle kernel paging request at virtual address dead000000000220
      ....
      PC is at soc_dapm_dai_stream_event.isra.14+0x20/0xd0
      LR is at snd_soc_dapm_stream_event+0x74/0xa8
      ....
      [<ffff000008715610>] soc_dapm_dai_stream_event.isra.14+0x20/0xd0
      [<ffff00000871989c>] snd_soc_dapm_stream_event+0x74/0xa8
      [<ffff00000871b23c>] close_delayed_work+0x3c/0x50
      [<ffff0000080bbd6c>] process_one_work+0x1ac/0x318
      [<ffff0000080bbf20>] worker_thread+0x48/0x420
      [<ffff0000080c201c>] kthread+0xfc/0x128
      [<ffff0000080842f0>] ret_from_fork+0x10/0x18
    
    For fixing the race, this patch adds a sync-point in pcm private_free
    callback to finish the delayed work before actually releasing the
    resources.
    Reported-by: default avatarHiep Cao Minh <cm-hiep@jinso.co.jp>
    Reported-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
    Tested-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
    Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
    Signed-off-by: default avatarMark Brown <broonie@kernel.org>
    5d61f0ba
soc-pcm.c 83 KB