ALSA: control: obsolete user_ctl_lock
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Thu, 3 Aug 2017 11:20:42 +0000 (20:20 +0900)
committerTakashi Iwai <tiwai@suse.de>
Fri, 4 Aug 2017 14:50:55 +0000 (16:50 +0200)
At a previous commit, concurrent requests for TLV data are maintained
exclusively between read requests and write/command requests. TLV
callback handlers in each driver has no risk from concurrent access for
reference/change.

In current implementation, 'struct snd_card' has a mutex to control
concurrent accesses to user-defined element sets. This commit obsoletes it.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
include/sound/core.h
sound/core/control.c
sound/core/init.c

index 55385588eefa082e28811f6b61a1c3da56f32b0f..357f36b5ee80403edff7f39947a36aeda022c6ae 100644 (file)
@@ -118,8 +118,6 @@ struct snd_card {
        int user_ctl_count;             /* count of all user controls */
        struct list_head controls;      /* all controls for this card */
        struct list_head ctl_files;     /* active control files */
-       struct mutex user_ctl_lock;     /* protects user controls against
-                                          concurrent access */
 
        struct snd_info_entry *proc_root;       /* root for soundcard specific files */
        struct snd_info_entry *proc_id; /* the card id */
index f3bd9bdba9a77766f350251efbed9d1f8ac0f9fd..989292fe33c2bc1cc038e5e399c022b5723616fe 100644 (file)
@@ -1095,9 +1095,7 @@ static int snd_ctl_elem_user_get(struct snd_kcontrol *kcontrol,
        char *src = ue->elem_data +
                        snd_ctl_get_ioff(kcontrol, &ucontrol->id) * size;
 
-       mutex_lock(&ue->card->user_ctl_lock);
        memcpy(&ucontrol->value, src, size);
-       mutex_unlock(&ue->card->user_ctl_lock);
        return 0;
 }
 
@@ -1110,11 +1108,9 @@ static int snd_ctl_elem_user_put(struct snd_kcontrol *kcontrol,
        char *dst = ue->elem_data +
                        snd_ctl_get_ioff(kcontrol, &ucontrol->id) * size;
 
-       mutex_lock(&ue->card->user_ctl_lock);
        change = memcmp(&ucontrol->value, dst, size) != 0;
        if (change)
                memcpy(dst, &ucontrol->value, size);
-       mutex_unlock(&ue->card->user_ctl_lock);
        return change;
 }
 
@@ -1124,44 +1120,37 @@ static int snd_ctl_elem_user_tlv(struct snd_kcontrol *kcontrol,
                                 unsigned int __user *tlv)
 {
        struct user_element *ue = kcontrol->private_data;
-       int change = 0;
-       void *new_data;
 
        if (op_flag == SNDRV_CTL_TLV_OP_WRITE) {
+               int change;
+               void *new_data;
+
                if (size > 1024 * 128)  /* sane value */
                        return -EINVAL;
 
                new_data = memdup_user(tlv, size);
                if (IS_ERR(new_data))
                        return PTR_ERR(new_data);
-               mutex_lock(&ue->card->user_ctl_lock);
                change = ue->tlv_data_size != size;
                if (!change)
                        change = memcmp(ue->tlv_data, new_data, size);
                kfree(ue->tlv_data);
                ue->tlv_data = new_data;
                ue->tlv_data_size = size;
-               mutex_unlock(&ue->card->user_ctl_lock);
+
+               return change;
        } else {
-               int ret = 0;
+               if (!ue->tlv_data_size || !ue->tlv_data)
+                       return -ENXIO;
+
+               if (size < ue->tlv_data_size)
+                       return -ENOSPC;
 
-               mutex_lock(&ue->card->user_ctl_lock);
-               if (!ue->tlv_data_size || !ue->tlv_data) {
-                       ret = -ENXIO;
-                       goto err_unlock;
-               }
-               if (size < ue->tlv_data_size) {
-                       ret = -ENOSPC;
-                       goto err_unlock;
-               }
                if (copy_to_user(tlv, ue->tlv_data, ue->tlv_data_size))
-                       ret = -EFAULT;
-err_unlock:
-               mutex_unlock(&ue->card->user_ctl_lock);
-               if (ret)
-                       return ret;
+                       return -EFAULT;
+
+               return 0;
        }
-       return change;
 }
 
 static int snd_ctl_elem_init_enum_names(struct user_element *ue)
index b4365bcf28a7345028976e48f81080a2447cb0b4..6e219dc23f9653547927f0fa0956a4cc581ae379 100644 (file)
@@ -248,7 +248,6 @@ int snd_card_new(struct device *parent, int idx, const char *xid,
        INIT_LIST_HEAD(&card->devices);
        init_rwsem(&card->controls_rwsem);
        rwlock_init(&card->ctl_files_rwlock);
-       mutex_init(&card->user_ctl_lock);
        INIT_LIST_HEAD(&card->controls);
        INIT_LIST_HEAD(&card->ctl_files);
        spin_lock_init(&card->files_lock);