From 7b42cfafdcbf73bd58687cbe3157b9ca4a0fd2e5 Mon Sep 17 00:00:00 2001 From: Takashi Sakamoto Date: Sun, 20 Aug 2017 13:49:06 +0900 Subject: [PATCH] ALSA: control: queue events within locking of controls_rwsem for ELEM_WRITE operation Any control event is queued by a call of snd_ctl_notify(). This function adds the event to each queue of opened file data corresponding to ALSA control character devices. This function acquired two types of lock; a counting semaphore for a list of the opened file data and a spinlock for card data opened by the file. Typically, this function is called after acquiring a counting semaphore for a list of elements in the card data. In current implementation of a handler for ELEM_WRITE request, the function is called after releasing the semaphore for a list of elements in the card data. This release is not necessarily needed. This commit removes the release to call the function within the critical section so that later commits are simple. Signed-off-by: Takashi Sakamoto Signed-off-by: Takashi Iwai --- sound/core/control.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sound/core/control.c b/sound/core/control.c index 9e7a4571488b..79fdb366ac8d 100644 --- a/sound/core/control.c +++ b/sound/core/control.c @@ -948,9 +948,8 @@ static int snd_ctl_elem_write(struct snd_card *card, struct snd_ctl_file *file, } if (result > 0) { struct snd_ctl_elem_id id = control->id; - up_read(&card->controls_rwsem); snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE, &id); - return 0; + result = 0; } } up_read(&card->controls_rwsem);