Dne 24. 06. 20 v 18:13 Pierre-Louis Bossart napsal(a):
On 6/24/20 11:03 AM, Takashi Iwai wrote:
The module argument passed to snd_card_new() must be a valid non-NULL
pointer when the module support is enabled. Since ASoC driver passes
the argument from each snd_soc_card definition, one may forget to set
the owner field and lead to a NULL module easily.
For catching such an overlook, add a WARN_ON() in snd_card_new().
Also, put the card->module assignment in the ifdef block for a very
minor optimization.
Signed-off-by: Takashi Iwai <tiwai@xxxxxxx>
---
sound/core/init.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/sound/core/init.c b/sound/core/init.c
index b02a99766351..0478847ba2b8 100644
--- a/sound/core/init.c
+++ b/sound/core/init.c
@@ -203,7 +203,10 @@ int snd_card_new(struct device *parent, int idx, const char *xid,
mutex_unlock(&snd_card_mutex);
card->dev = parent;
card->number = idx;
+#ifdef MODULE
+ WARN_ON(!module);
card->module = module;
+#endif
INIT_LIST_HEAD(&card->devices);
init_rwsem(&card->controls_rwsem);
rwlock_init(&card->ctl_files_rwlock);
Would it make sense to also change the ASoC code to use THIS_MODULE
instead of card->owner?
/* card bind complete so register a sound card */
ret = snd_card_new(card->dev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1,
card->owner, 0, &card->snd_card);
A quick grep shows we are setting .owner = THIS_MODULE pretty much all
the time for machine drivers.
THIS_MODULE is defined when the object file is created (compile time). We want
to assign the real module which creates the card here, not "snd_soc_core"
which is misleading.
Jaroslav
--
Jaroslav Kysela <perex@xxxxxxxx>
Linux Sound Maintainer; ALSA Project; Red Hat, Inc.