[PATCH v2 0/5] ALSA: control - add generic LED API

Jaroslav Kysela perex at perex.cz
Sun Feb 21 19:01:02 CET 2021


Dne 21. 02. 21 v 14:14 Hans de Goede napsal(a):

>> v2 changes:
>>   - fix the locking - remove the controls_rwsem read lock
>>     in the element get (the consistency is already protected
>>     with the global snd_ctl_led_mutex and possible partial
>>     value writes are catched with the next value change
>>     notification callback)
> 
> I'm afraid that lockdep still is unhappy. With v2 there is a new
> (different) lockdep warning.

> If you can send me another fixup-diff then I'll make sure to
> test this before you do a v3, so that we can be sure that
> all cases which my setup catches are resolved before sending
> out v3.

Thank you for your test. This change (on top of v2) should resolve this
remaining lockdep:

diff --git a/sound/core/control.c b/sound/core/control.c
index c9f062fada0a..494f0154e8be 100644
--- a/sound/core/control.c
+++ b/sound/core/control.c
@@ -2051,7 +2051,9 @@ void snd_ctl_register_layer(struct snd_ctl_layer_ops *lops)
 	for (card_number = 0; card_number < SNDRV_CARDS; card_number++) {
 		card = snd_card_ref(card_number);
 		if (card) {
+			down_read(&card->controls_rwsem);
 			lops->lregister(card);
+			up_read(&card->controls_rwsem);
 			snd_card_unref(card);
 		}
 	}
@@ -2113,10 +2115,12 @@ static int snd_ctl_dev_register(struct snd_device *device)
 				  &snd_ctl_f_ops, card, &card->ctl_dev);
 	if (err < 0)
 		return err;
+	down_read(&card->controls_rwsem);
 	down_read(&snd_ctl_layer_rwsem);
 	for (lops = snd_ctl_layer; lops; lops = lops->next)
 		lops->lregister(card);
 	up_read(&snd_ctl_layer_rwsem);
+	up_read(&card->controls_rwsem);
 	return 0;
 }

@@ -2137,10 +2141,12 @@ static int snd_ctl_dev_disconnect(struct snd_device
*device)
 	}
 	read_unlock_irqrestore(&card->ctl_files_rwlock, flags);

+	down_read(&card->controls_rwsem);
 	down_read(&snd_ctl_layer_rwsem);
 	for (lops = snd_ctl_layer; lops; lops = lops->next)
 		lops->ldisconnect(card);
 	up_read(&snd_ctl_layer_rwsem);
+	up_read(&card->controls_rwsem);

 	return snd_unregister_device(&card->ctl_dev);
 }
diff --git a/sound/core/control_led.c b/sound/core/control_led.c
index cafe4c82ca35..b8bb8fd46686 100644
--- a/sound/core/control_led.c
+++ b/sound/core/control_led.c
@@ -235,11 +235,10 @@ static void snd_ctl_led_register(struct snd_card *card)
 	mutex_lock(&snd_ctl_led_mutex);
 	snd_ctl_led_card_valid[card->number] = true;
 	mutex_unlock(&snd_ctl_led_mutex);
-	down_read(&card->controls_rwsem);
+	/* the register callback is already called with held card->controls_rwsem */
 	list_for_each_entry(kctl, &card->controls, list)
 		for (ioff = 0; ioff < kctl->count; ioff++)
 			snd_ctl_led_notify(card, SNDRV_CTL_EVENT_MASK_VALUE, kctl, ioff);
-	up_read(&card->controls_rwsem);
 	snd_ctl_led_refresh();
 }


					Jaroslav

-- 
Jaroslav Kysela <perex at perex.cz>
Linux Sound Maintainer; ALSA Project; Red Hat, Inc.


More information about the Alsa-devel mailing list