summaryrefslogtreecommitdiffstats
path: root/sound/core/control.c
diff options
context:
space:
mode:
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>2017-08-03 20:20:40 +0900
committerTakashi Iwai <tiwai@suse.de>2017-08-04 16:50:54 +0200
commit28a0989c995087129b11ca3e00eb37ab77c29bce (patch)
treed0e0d73225cfdf33f32bdc6784ef4371885cc067 /sound/core/control.c
parent74be62c7cefbf320e0605f3da6639ef80448ff00 (diff)
downloadlinux-stable-28a0989c995087129b11ca3e00eb37ab77c29bce.tar.gz
linux-stable-28a0989c995087129b11ca3e00eb37ab77c29bce.tar.bz2
linux-stable-28a0989c995087129b11ca3e00eb37ab77c29bce.zip
ALSA: control: queue events within locking of controls_rwsem for TLV 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 TLV request handler, 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 <o-takashi@sakamocchi.jp> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/core/control.c')
-rw-r--r--sound/core/control.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/sound/core/control.c b/sound/core/control.c
index 3c6be1452e35..d2e1edbf843a 100644
--- a/sound/core/control.c
+++ b/sound/core/control.c
@@ -1450,9 +1450,8 @@ static int snd_ctl_tlv_ioctl(struct snd_ctl_file *file,
err = kctl->tlv.c(kctl, op_flag, tlv.length, _tlv->tlv);
if (err > 0) {
struct snd_ctl_elem_id id = kctl->id;
- up_read(&card->controls_rwsem);
snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_TLV, &id);
- return 0;
+ err = 0;
}
} else {
if (op_flag != SNDRV_CTL_TLV_OP_READ) {