lkml.org 
[lkml]   [2021]   [Jul]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.13 129/351] ALSA: usb-audio: scarlett2: Fix data_mutex lock
    Date
    From: Geoffrey D. Bennett <g@b4.vu>

    [ Upstream commit 9b5ddea9ce5a68d7d2bedcb69901ac2a86c96c7b ]

    The private->vol_updated flag was being checked outside of the
    mutex_lock/unlock() of private->data_mutex leading to the volume data
    being fetched twice from the device unnecessarily or old volume data
    being returned.

    Update scarlett2_*_ctl_get() and include the private->vol_updated flag
    check inside the critical region.

    Signed-off-by: Geoffrey D. Bennett <g@b4.vu>
    Link: https://lore.kernel.org/r/20210620164643.GA9216@m.b4.vu
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    sound/usb/mixer_scarlett_gen2.c | 21 +++++++++------------
    1 file changed, 9 insertions(+), 12 deletions(-)

    diff --git a/sound/usb/mixer_scarlett_gen2.c b/sound/usb/mixer_scarlett_gen2.c
    index 1982e67a0f32..2ea41c8eafd1 100644
    --- a/sound/usb/mixer_scarlett_gen2.c
    +++ b/sound/usb/mixer_scarlett_gen2.c
    @@ -1033,11 +1033,10 @@ static int scarlett2_master_volume_ctl_get(struct snd_kcontrol *kctl,
    struct usb_mixer_interface *mixer = elem->head.mixer;
    struct scarlett2_mixer_data *private = mixer->private_data;

    - if (private->vol_updated) {
    - mutex_lock(&private->data_mutex);
    + mutex_lock(&private->data_mutex);
    + if (private->vol_updated)
    scarlett2_update_volumes(mixer);
    - mutex_unlock(&private->data_mutex);
    - }
    + mutex_unlock(&private->data_mutex);

    ucontrol->value.integer.value[0] = private->master_vol;
    return 0;
    @@ -1051,11 +1050,10 @@ static int scarlett2_volume_ctl_get(struct snd_kcontrol *kctl,
    struct scarlett2_mixer_data *private = mixer->private_data;
    int index = elem->control;

    - if (private->vol_updated) {
    - mutex_lock(&private->data_mutex);
    + mutex_lock(&private->data_mutex);
    + if (private->vol_updated)
    scarlett2_update_volumes(mixer);
    - mutex_unlock(&private->data_mutex);
    - }
    + mutex_unlock(&private->data_mutex);

    ucontrol->value.integer.value[0] = private->vol[index];
    return 0;
    @@ -1319,11 +1317,10 @@ static int scarlett2_button_ctl_get(struct snd_kcontrol *kctl,
    struct usb_mixer_interface *mixer = elem->head.mixer;
    struct scarlett2_mixer_data *private = mixer->private_data;

    - if (private->vol_updated) {
    - mutex_lock(&private->data_mutex);
    + mutex_lock(&private->data_mutex);
    + if (private->vol_updated)
    scarlett2_update_volumes(mixer);
    - mutex_unlock(&private->data_mutex);
    - }
    + mutex_unlock(&private->data_mutex);

    ucontrol->value.enumerated.item[0] = private->buttons[elem->control];
    return 0;
    --
    2.30.2


    \
     
     \ /
      Last update: 2021-07-19 19:37    [W:4.082 / U:0.688 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site