mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-12 13:55:32 +00:00
ASoC: soc-core: add snd_soc_find_dai_with_mutex()
commit25612477d2
("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:25612477d2
("ASoC: soc-dai: set dai_link dpcm_ flags with a helper") Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Link: https://lore.kernel.org/r/87blixvuab.wl-kuninori.morimoto.gx@renesas.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
d563b6c834
commit
20d9fdee72
3 changed files with 17 additions and 2 deletions
|
@ -1361,6 +1361,8 @@ void snd_soc_unregister_dai(struct snd_soc_dai *dai);
|
||||||
|
|
||||||
struct snd_soc_dai *snd_soc_find_dai(
|
struct snd_soc_dai *snd_soc_find_dai(
|
||||||
const struct snd_soc_dai_link_component *dlc);
|
const struct snd_soc_dai_link_component *dlc);
|
||||||
|
struct snd_soc_dai *snd_soc_find_dai_with_mutex(
|
||||||
|
const struct snd_soc_dai_link_component *dlc);
|
||||||
|
|
||||||
#include <sound/soc-dai.h>
|
#include <sound/soc-dai.h>
|
||||||
|
|
||||||
|
|
|
@ -834,6 +834,19 @@ struct snd_soc_dai *snd_soc_find_dai(
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(snd_soc_find_dai);
|
EXPORT_SYMBOL_GPL(snd_soc_find_dai);
|
||||||
|
|
||||||
|
struct snd_soc_dai *snd_soc_find_dai_with_mutex(
|
||||||
|
const struct snd_soc_dai_link_component *dlc)
|
||||||
|
{
|
||||||
|
struct snd_soc_dai *dai;
|
||||||
|
|
||||||
|
mutex_lock(&client_mutex);
|
||||||
|
dai = snd_soc_find_dai(dlc);
|
||||||
|
mutex_unlock(&client_mutex);
|
||||||
|
|
||||||
|
return dai;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(snd_soc_find_dai_with_mutex);
|
||||||
|
|
||||||
static int soc_dai_link_sanity_check(struct snd_soc_card *card,
|
static int soc_dai_link_sanity_check(struct snd_soc_card *card,
|
||||||
struct snd_soc_dai_link *link)
|
struct snd_soc_dai_link *link)
|
||||||
{
|
{
|
||||||
|
|
|
@ -412,14 +412,14 @@ void snd_soc_dai_link_set_capabilities(struct snd_soc_dai_link *dai_link)
|
||||||
supported_codec = false;
|
supported_codec = false;
|
||||||
|
|
||||||
for_each_link_cpus(dai_link, i, cpu) {
|
for_each_link_cpus(dai_link, i, cpu) {
|
||||||
dai = snd_soc_find_dai(cpu);
|
dai = snd_soc_find_dai_with_mutex(cpu);
|
||||||
if (dai && snd_soc_dai_stream_valid(dai, direction)) {
|
if (dai && snd_soc_dai_stream_valid(dai, direction)) {
|
||||||
supported_cpu = true;
|
supported_cpu = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for_each_link_codecs(dai_link, i, codec) {
|
for_each_link_codecs(dai_link, i, codec) {
|
||||||
dai = snd_soc_find_dai(codec);
|
dai = snd_soc_find_dai_with_mutex(codec);
|
||||||
if (dai && snd_soc_dai_stream_valid(dai, direction)) {
|
if (dai && snd_soc_dai_stream_valid(dai, direction)) {
|
||||||
supported_codec = true;
|
supported_codec = true;
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue