path: root/sound/last.c
diff options
authorTakashi Iwai <tiwai@suse.de>2019-04-16 18:18:47 +0200
committerTakashi Iwai <tiwai@suse.de>2019-04-17 07:16:15 +0200
commitf4fa968950aef7efb98a0899bb0132405e2edaf1 (patch)
tree2053bcf32985ef7539b02f10246bf67c4543903a /sound/last.c
parentc989954938761a2939a21fcbc768af182de6be58 (diff)
ALSA: core: Don't refer to snd_cards array directly
The snd_cards[] array holds the card pointers that have been currently registered, and it's exported for the external modules that may need to refer a card object. But accessing to this array can be racy against the driver probe or removal, as the card registration or free may happen concurrently. This patch gets rid of the direct access to snd_cards[] array and provides a helper function to give the card object from the index number with a refcount management. Then the caller can access to the given card object safely, and releases it via snd_card_unref(). While we're at it, add a proper comment to snd_card_unref() and make it an inlined function for type-safety, too. Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/last.c')
1 files changed, 7 insertions, 3 deletions
diff --git a/sound/last.c b/sound/last.c
index 43f222825038..4f5a624ab438 100644
--- a/sound/last.c
+++ b/sound/last.c
@@ -24,14 +24,18 @@
static int __init alsa_sound_last_init(void)
+ struct snd_card *card;
int idx, ok = 0;
printk(KERN_INFO "ALSA device list:\n");
- for (idx = 0; idx < SNDRV_CARDS; idx++)
- if (snd_cards[idx] != NULL) {
- printk(KERN_INFO " #%i: %s\n", idx, snd_cards[idx]->longname);
+ for (idx = 0; idx < SNDRV_CARDS; idx++) {
+ card = snd_card_ref(idx);
+ if (card) {
+ printk(KERN_INFO " #%i: %s\n", idx, card->longname);
+ snd_card_unref(card);
+ }
if (ok == 0)
printk(KERN_INFO " No soundcards found.\n");
return 0;

Privacy Policy