• Kuninori Morimoto's avatar
    ASoC: soc-core: add snd_soc_find_dai_with_mutex() · 20d9fdee
    Kuninori Morimoto authored
    commit 25612477 ("ASoC: soc-dai: set dai_link dpcm_ flags with a helper")
    added snd_soc_dai_link_set_capabilities().
    But it is using snd_soc_find_dai() (A) which is required client_mutex (B).
    And client_mutex is soc-core.c local.
    
    	struct snd_soc_dai *snd_soc_find_dai(xxx)
    	{
    		...
    (B)		lockdep_assert_held(&client_mutex);
    		...
    	}
    
    	void snd_soc_dai_link_set_capabilities(xxx)
    	{
    		...
    		for_each_pcm_streams(direction) {
    			...
    			for_each_link_cpus(dai_link, i, cpu) {
    (A)				dai = snd_soc_find_dai(cpu);
    				...
    			}
    			...
    			for_each_link_codecs(dai_link, i, codec) {
    (A)				dai = snd_soc_find_dai(codec);
    				...
    			}
    		}
    		...
    	}
    
    Because of these background, we will get WARNING if .config has CONFIG_LOCKDEP.
    
    	WARNING: CPU: 2 PID: 53 at sound/soc/soc-core.c:814 snd_soc_find_dai+0xf8/0x100
    	CPU: 2 PID: 53 Comm: kworker/2:1 Not tainted 5.7.0-rc1+ #328
    	Hardware name: Renesas H3ULCB Kingfisher board based on r8a77951 (DT)
    	Workqueue: events deferred_probe_work_func
    	pstate: 60000005 (nZCv daif -PAN -UAO)
    	pc : snd_soc_find_dai+0xf8/0x100
    	lr : snd_soc_find_dai+0xf4/0x100
    	...
    	Call trace:
    	 snd_soc_find_dai+0xf8/0x100
    	 snd_soc_dai_link_set_capabilities+0xa0/0x16c
    	 graph_dai_link_of_dpcm+0x390/0x3c0
    	 graph_for_each_link+0x134/0x200
    	 graph_probe+0x144/0x230
    	 platform_drv_probe+0x5c/0xb0
    	 really_probe+0xe4/0x430
    	 driver_probe_device+0x60/0xf4
    
    snd_soc_find_dai() will be used from (X) CPU/Codec/Platform driver with
    mutex lock, and (Y) Card driver without mutex lock.
    This snd_soc_dai_link_set_capabilities() is for Card driver,
    this means called without mutex.
    This patch adds snd_soc_find_dai_with_mutex() to solve it.
    
    Fixes: 25612477 ("ASoC: soc-dai: set dai_link dpcm_ flags with a helper")
    Signed-off-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
    Link: https://lore.kernel.org/r/87blixvuab.wl-kuninori.morimoto.gx@renesas.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
    20d9fdee
soc-core.c 76.2 KB