Skip to content

Commit 89b4ab2

Browse files
committed
ALSA: seq: virmidi: Use READ_ONCE/WRITE_ONCE() macros
The trigger flag in vmidi object can be referred in different contexts concurrently, hence it's better to be put with READ_ONCE() and WRITE_ONCE() macros to assure the accesses. Signed-off-by: Takashi Iwai <[email protected]>
1 parent f7debfe commit 89b4ab2

File tree

2 files changed

+6
-10
lines changed

2 files changed

+6
-10
lines changed

include/sound/seq_virmidi.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ struct snd_virmidi {
3636
int seq_mode;
3737
int client;
3838
int port;
39-
unsigned int trigger: 1;
39+
bool trigger;
4040
struct snd_midi_event *parser;
4141
struct snd_seq_event event;
4242
struct snd_virmidi_dev *rdev;

sound/core/seq/seq_virmidi.c

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ static int snd_virmidi_dev_receive_event(struct snd_virmidi_dev *rdev,
8989
else
9090
down_read(&rdev->filelist_sem);
9191
list_for_each_entry(vmidi, &rdev->filelist, list) {
92-
if (!vmidi->trigger)
92+
if (!READ_ONCE(vmidi->trigger))
9393
continue;
9494
if (ev->type == SNDRV_SEQ_EVENT_SYSEX) {
9595
if ((ev->flags & SNDRV_SEQ_EVENT_LENGTH_MASK) != SNDRV_SEQ_EVENT_LENGTH_VARIABLE)
@@ -147,11 +147,7 @@ static void snd_virmidi_input_trigger(struct snd_rawmidi_substream *substream, i
147147
{
148148
struct snd_virmidi *vmidi = substream->runtime->private_data;
149149

150-
if (up) {
151-
vmidi->trigger = 1;
152-
} else {
153-
vmidi->trigger = 0;
154-
}
150+
WRITE_ONCE(vmidi->trigger, !!up);
155151
}
156152

157153
/* process rawmidi bytes and send events;
@@ -175,7 +171,7 @@ static void snd_vmidi_output_work(struct work_struct *work)
175171
return;
176172
}
177173

178-
while (vmidi->trigger) {
174+
while (READ_ONCE(vmidi->trigger)) {
179175
if (snd_rawmidi_transmit(substream, &input, 1) != 1)
180176
break;
181177
if (snd_midi_event_encode_byte(vmidi->parser, input,
@@ -201,7 +197,7 @@ static void snd_virmidi_output_trigger(struct snd_rawmidi_substream *substream,
201197
{
202198
struct snd_virmidi *vmidi = substream->runtime->private_data;
203199

204-
vmidi->trigger = !!up;
200+
WRITE_ONCE(vmidi->trigger, !!up);
205201
if (up)
206202
queue_work(system_highpri_wq, &vmidi->output_work);
207203
}
@@ -289,7 +285,7 @@ static int snd_virmidi_output_close(struct snd_rawmidi_substream *substream)
289285
{
290286
struct snd_virmidi *vmidi = substream->runtime->private_data;
291287

292-
vmidi->trigger = 0; /* to be sure */
288+
WRITE_ONCE(vmidi->trigger, false); /* to be sure */
293289
cancel_work_sync(&vmidi->output_work);
294290
snd_midi_event_free(vmidi->parser);
295291
substream->runtime->private_data = NULL;

0 commit comments

Comments
 (0)