Commit 9c2cc565 authored by Takashi Iwai's avatar Takashi Iwai

ALSA: control: Take lock in snd_ctl_find_id() and snd_ctl_find_numid()

Now all needed callers have been replaced with *_locked() versions,
let's turn on the locking in snd_ctl_find_id() and
snd_ctl_find_numid().

This patch also adds the lockdep assertions for debugging, too.

Link: https://lore.kernel.org/r/20230718141304.1032-11-tiwai@suse.deSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent b1e055f6
...@@ -836,6 +836,7 @@ snd_ctl_find_numid_locked(struct snd_card *card, unsigned int numid) ...@@ -836,6 +836,7 @@ snd_ctl_find_numid_locked(struct snd_card *card, unsigned int numid)
{ {
if (snd_BUG_ON(!card || !numid)) if (snd_BUG_ON(!card || !numid))
return NULL; return NULL;
lockdep_assert_held(&card->controls_rwsem);
#ifdef CONFIG_SND_CTL_FAST_LOOKUP #ifdef CONFIG_SND_CTL_FAST_LOOKUP
return xa_load(&card->ctl_numids, numid); return xa_load(&card->ctl_numids, numid);
#else #else
...@@ -852,11 +853,18 @@ EXPORT_SYMBOL(snd_ctl_find_numid_locked); ...@@ -852,11 +853,18 @@ EXPORT_SYMBOL(snd_ctl_find_numid_locked);
* Finds the control instance with the given number-id from the card. * Finds the control instance with the given number-id from the card.
* *
* Return: The pointer of the instance if found, or %NULL if not. * Return: The pointer of the instance if found, or %NULL if not.
*
* Note that this function takes card->controls_rwsem lock internally.
*/ */
struct snd_kcontrol *snd_ctl_find_numid(struct snd_card *card, struct snd_kcontrol *snd_ctl_find_numid(struct snd_card *card,
unsigned int numid) unsigned int numid)
{ {
return snd_ctl_find_numid_locked(card, numid); struct snd_kcontrol *kctl;
down_read(&card->controls_rwsem);
kctl = snd_ctl_find_numid_locked(card, numid);
up_read(&card->controls_rwsem);
return kctl;
} }
EXPORT_SYMBOL(snd_ctl_find_numid); EXPORT_SYMBOL(snd_ctl_find_numid);
...@@ -879,6 +887,7 @@ struct snd_kcontrol *snd_ctl_find_id_locked(struct snd_card *card, ...@@ -879,6 +887,7 @@ struct snd_kcontrol *snd_ctl_find_id_locked(struct snd_card *card,
if (snd_BUG_ON(!card || !id)) if (snd_BUG_ON(!card || !id))
return NULL; return NULL;
lockdep_assert_held(&card->controls_rwsem);
if (id->numid != 0) if (id->numid != 0)
return snd_ctl_find_numid_locked(card, id->numid); return snd_ctl_find_numid_locked(card, id->numid);
#ifdef CONFIG_SND_CTL_FAST_LOOKUP #ifdef CONFIG_SND_CTL_FAST_LOOKUP
...@@ -905,11 +914,18 @@ EXPORT_SYMBOL(snd_ctl_find_id_locked); ...@@ -905,11 +914,18 @@ EXPORT_SYMBOL(snd_ctl_find_id_locked);
* Finds the control instance with the given id from the card. * Finds the control instance with the given id from the card.
* *
* Return: The pointer of the instance if found, or %NULL if not. * Return: The pointer of the instance if found, or %NULL if not.
*
* Note that this function takes card->controls_rwsem lock internally.
*/ */
struct snd_kcontrol *snd_ctl_find_id(struct snd_card *card, struct snd_kcontrol *snd_ctl_find_id(struct snd_card *card,
const struct snd_ctl_elem_id *id) const struct snd_ctl_elem_id *id)
{ {
return snd_ctl_find_id_locked(card, id); struct snd_kcontrol *kctl;
down_read(&card->controls_rwsem);
kctl = snd_ctl_find_id_locked(card, id);
up_read(&card->controls_rwsem);
return kctl;
} }
EXPORT_SYMBOL(snd_ctl_find_id); EXPORT_SYMBOL(snd_ctl_find_id);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment