ALSA: ump: Use guard() for locking
BugLink: https://bugs.launchpad.net/bugs/2106632 [ Upstream commit 631896f7eaaf8cf8c639b065d3c9fbaa66da5d32 ] We can simplify the code gracefully with new guard() macro and co for automatic cleanup of locks. Only the code refactoring, and no functional changes. Signed-off-by: Takashi Iwai <tiwai@suse.de> Link: https://lore.kernel.org/r/20240227085306.9764-2-tiwai@suse.de Stable-dep-of: 3978d53df723 ("ALSA: ump: Don't open legacy substream for an inactive group") Signed-off-by: Sasha Levin <sashal@kernel.org> Signed-off-by: Manuel Diewald <manuel.diewald@canonical.com> Signed-off-by: Mehmet Basaran <mehmet.basaran@canonical.com>
This commit is contained in:
committed by
Mehmet Basaran
parent
0ae5b38370
commit
11bd03202d
+12
-23
@@ -1082,13 +1082,11 @@ static int snd_ump_legacy_open(struct snd_rawmidi_substream *substream)
|
||||
struct snd_ump_endpoint *ump = substream->rmidi->private_data;
|
||||
int dir = substream->stream;
|
||||
int group = ump->legacy_mapping[substream->number];
|
||||
int err = 0;
|
||||
int err;
|
||||
|
||||
mutex_lock(&ump->open_mutex);
|
||||
if (ump->legacy_substreams[dir][group]) {
|
||||
err = -EBUSY;
|
||||
goto unlock;
|
||||
}
|
||||
guard(mutex)(&ump->open_mutex);
|
||||
if (ump->legacy_substreams[dir][group])
|
||||
return -EBUSY;
|
||||
if (dir == SNDRV_RAWMIDI_STREAM_OUTPUT) {
|
||||
if (!ump->legacy_out_opens) {
|
||||
err = snd_rawmidi_kernel_open(&ump->core, 0,
|
||||
@@ -1096,17 +1094,14 @@ static int snd_ump_legacy_open(struct snd_rawmidi_substream *substream)
|
||||
SNDRV_RAWMIDI_LFLG_APPEND,
|
||||
&ump->legacy_out_rfile);
|
||||
if (err < 0)
|
||||
goto unlock;
|
||||
return err;
|
||||
}
|
||||
ump->legacy_out_opens++;
|
||||
snd_ump_convert_reset(&ump->out_cvts[group]);
|
||||
}
|
||||
spin_lock_irq(&ump->legacy_locks[dir]);
|
||||
guard(spinlock_irq)(&ump->legacy_locks[dir]);
|
||||
ump->legacy_substreams[dir][group] = substream;
|
||||
spin_unlock_irq(&ump->legacy_locks[dir]);
|
||||
unlock:
|
||||
mutex_unlock(&ump->open_mutex);
|
||||
return err;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int snd_ump_legacy_close(struct snd_rawmidi_substream *substream)
|
||||
@@ -1115,15 +1110,13 @@ static int snd_ump_legacy_close(struct snd_rawmidi_substream *substream)
|
||||
int dir = substream->stream;
|
||||
int group = ump->legacy_mapping[substream->number];
|
||||
|
||||
mutex_lock(&ump->open_mutex);
|
||||
spin_lock_irq(&ump->legacy_locks[dir]);
|
||||
ump->legacy_substreams[dir][group] = NULL;
|
||||
spin_unlock_irq(&ump->legacy_locks[dir]);
|
||||
guard(mutex)(&ump->open_mutex);
|
||||
scoped_guard(spinlock_irq, &ump->legacy_locks[dir])
|
||||
ump->legacy_substreams[dir][group] = NULL;
|
||||
if (dir == SNDRV_RAWMIDI_STREAM_OUTPUT) {
|
||||
if (!--ump->legacy_out_opens)
|
||||
snd_rawmidi_kernel_release(&ump->legacy_out_rfile);
|
||||
}
|
||||
mutex_unlock(&ump->open_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1175,12 +1168,11 @@ static int process_legacy_output(struct snd_ump_endpoint *ump,
|
||||
const int dir = SNDRV_RAWMIDI_STREAM_OUTPUT;
|
||||
unsigned char c;
|
||||
int group, size = 0;
|
||||
unsigned long flags;
|
||||
|
||||
if (!ump->out_cvts || !ump->legacy_out_opens)
|
||||
return 0;
|
||||
|
||||
spin_lock_irqsave(&ump->legacy_locks[dir], flags);
|
||||
guard(spinlock_irqsave)(&ump->legacy_locks[dir]);
|
||||
for (group = 0; group < SNDRV_UMP_MAX_GROUPS; group++) {
|
||||
substream = ump->legacy_substreams[dir][group];
|
||||
if (!substream)
|
||||
@@ -1196,7 +1188,6 @@ static int process_legacy_output(struct snd_ump_endpoint *ump,
|
||||
break;
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(&ump->legacy_locks[dir], flags);
|
||||
return size;
|
||||
}
|
||||
|
||||
@@ -1206,18 +1197,16 @@ static void process_legacy_input(struct snd_ump_endpoint *ump, const u32 *src,
|
||||
struct snd_rawmidi_substream *substream;
|
||||
unsigned char buf[16];
|
||||
unsigned char group;
|
||||
unsigned long flags;
|
||||
const int dir = SNDRV_RAWMIDI_STREAM_INPUT;
|
||||
int size;
|
||||
|
||||
size = snd_ump_convert_from_ump(src, buf, &group);
|
||||
if (size <= 0)
|
||||
return;
|
||||
spin_lock_irqsave(&ump->legacy_locks[dir], flags);
|
||||
guard(spinlock_irqsave)(&ump->legacy_locks[dir]);
|
||||
substream = ump->legacy_substreams[dir][group];
|
||||
if (substream)
|
||||
snd_rawmidi_receive(substream, buf, size);
|
||||
spin_unlock_irqrestore(&ump->legacy_locks[dir], flags);
|
||||
}
|
||||
|
||||
/* Fill ump->legacy_mapping[] for groups to be used for legacy rawmidi */
|
||||
|
||||
Reference in New Issue
Block a user