aboutsummaryrefslogtreecommitdiffstats
path: root/sound/usb/line6
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2015-01-23 06:39:11 -0500
committerTakashi Iwai <tiwai@suse.de>2015-01-28 01:20:34 -0500
commitbc518ba4ccb487ef52e418c3ff68050cf07b3bc0 (patch)
tree9d7e78126f2e8a4a1332d7df0c6975892cf9632e /sound/usb/line6
parentb55004f9fdee80de1b6982b3e99ebaeb7d1e7a6c (diff)
ALSA: line6: Reduce superfluous spinlock in midi.c
The midi_transmit_lock is used always inside the send_urb_lock, thus it doesn't play any role. Let's kill it. Also, rename "send_urb_lock" as a more simple name "lock" since this is the only lock for midi. Tested-by: Chris Rorvick <chris@rorvick.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/usb/line6')
-rw-r--r--sound/usb/line6/midi.c18
-rw-r--r--sound/usb/line6/midi.h7
2 files changed, 7 insertions, 18 deletions
diff --git a/sound/usb/line6/midi.c b/sound/usb/line6/midi.c
index b5a58a7fe11a..beeedf9a2cbe 100644
--- a/sound/usb/line6/midi.c
+++ b/sound/usb/line6/midi.c
@@ -45,12 +45,9 @@ static void line6_midi_transmit(struct snd_rawmidi_substream *substream)
45 line6_rawmidi_substream_midi(substream)->line6; 45 line6_rawmidi_substream_midi(substream)->line6;
46 struct snd_line6_midi *line6midi = line6->line6midi; 46 struct snd_line6_midi *line6midi = line6->line6midi;
47 struct midi_buffer *mb = &line6midi->midibuf_out; 47 struct midi_buffer *mb = &line6midi->midibuf_out;
48 unsigned long flags;
49 unsigned char chunk[LINE6_FALLBACK_MAXPACKETSIZE]; 48 unsigned char chunk[LINE6_FALLBACK_MAXPACKETSIZE];
50 int req, done; 49 int req, done;
51 50
52 spin_lock_irqsave(&line6->line6midi->midi_transmit_lock, flags);
53
54 for (;;) { 51 for (;;) {
55 req = min(line6_midibuf_bytes_free(mb), line6->max_packet_size); 52 req = min(line6_midibuf_bytes_free(mb), line6->max_packet_size);
56 done = snd_rawmidi_transmit_peek(substream, chunk, req); 53 done = snd_rawmidi_transmit_peek(substream, chunk, req);
@@ -71,8 +68,6 @@ static void line6_midi_transmit(struct snd_rawmidi_substream *substream)
71 68
72 send_midi_async(line6, chunk, done); 69 send_midi_async(line6, chunk, done);
73 } 70 }
74
75 spin_unlock_irqrestore(&line6->line6midi->midi_transmit_lock, flags);
76} 71}
77 72
78/* 73/*
@@ -92,7 +87,7 @@ static void midi_sent(struct urb *urb)
92 if (status == -ESHUTDOWN) 87 if (status == -ESHUTDOWN)
93 return; 88 return;
94 89
95 spin_lock_irqsave(&line6->line6midi->send_urb_lock, flags); 90 spin_lock_irqsave(&line6->line6midi->lock, flags);
96 num = --line6->line6midi->num_active_send_urbs; 91 num = --line6->line6midi->num_active_send_urbs;
97 92
98 if (num == 0) { 93 if (num == 0) {
@@ -103,12 +98,12 @@ static void midi_sent(struct urb *urb)
103 if (num == 0) 98 if (num == 0)
104 wake_up(&line6->line6midi->send_wait); 99 wake_up(&line6->line6midi->send_wait);
105 100
106 spin_unlock_irqrestore(&line6->line6midi->send_urb_lock, flags); 101 spin_unlock_irqrestore(&line6->line6midi->lock, flags);
107} 102}
108 103
109/* 104/*
110 Send an asynchronous MIDI message. 105 Send an asynchronous MIDI message.
111 Assumes that line6->line6midi->send_urb_lock is held 106 Assumes that line6->line6midi->lock is held
112 (i.e., this function is serialized). 107 (i.e., this function is serialized).
113*/ 108*/
114static int send_midi_async(struct usb_line6 *line6, unsigned char *data, 109static int send_midi_async(struct usb_line6 *line6, unsigned char *data,
@@ -166,12 +161,12 @@ static void line6_midi_output_trigger(struct snd_rawmidi_substream *substream,
166 line6_rawmidi_substream_midi(substream)->line6; 161 line6_rawmidi_substream_midi(substream)->line6;
167 162
168 line6->line6midi->substream_transmit = substream; 163 line6->line6midi->substream_transmit = substream;
169 spin_lock_irqsave(&line6->line6midi->send_urb_lock, flags); 164 spin_lock_irqsave(&line6->line6midi->lock, flags);
170 165
171 if (line6->line6midi->num_active_send_urbs == 0) 166 if (line6->line6midi->num_active_send_urbs == 0)
172 line6_midi_transmit(substream); 167 line6_midi_transmit(substream);
173 168
174 spin_unlock_irqrestore(&line6->line6midi->send_urb_lock, flags); 169 spin_unlock_irqrestore(&line6->line6midi->lock, flags);
175} 170}
176 171
177static void line6_midi_output_drain(struct snd_rawmidi_substream *substream) 172static void line6_midi_output_drain(struct snd_rawmidi_substream *substream)
@@ -281,8 +276,7 @@ int line6_init_midi(struct usb_line6 *line6)
281 rmidi->private_free = snd_line6_midi_free; 276 rmidi->private_free = snd_line6_midi_free;
282 277
283 init_waitqueue_head(&line6midi->send_wait); 278 init_waitqueue_head(&line6midi->send_wait);
284 spin_lock_init(&line6midi->send_urb_lock); 279 spin_lock_init(&line6midi->lock);
285 spin_lock_init(&line6midi->midi_transmit_lock);
286 line6midi->line6 = line6; 280 line6midi->line6 = line6;
287 281
288 err = line6_midibuf_init(&line6midi->midibuf_in, MIDI_BUFFER_SIZE, 0); 282 err = line6_midibuf_init(&line6midi->midibuf_in, MIDI_BUFFER_SIZE, 0);
diff --git a/sound/usb/line6/midi.h b/sound/usb/line6/midi.h
index ba6bf3828aa5..9d9467b2613c 100644
--- a/sound/usb/line6/midi.h
+++ b/sound/usb/line6/midi.h
@@ -40,14 +40,9 @@ struct snd_line6_midi {
40 int num_active_send_urbs; 40 int num_active_send_urbs;
41 41
42 /** 42 /**
43 Spin lock to protect updates of send_urb.
44 */
45 spinlock_t send_urb_lock;
46
47 /**
48 Spin lock to protect MIDI buffer handling. 43 Spin lock to protect MIDI buffer handling.
49 */ 44 */
50 spinlock_t midi_transmit_lock; 45 spinlock_t lock;
51 46
52 /** 47 /**
53 Wait queue for MIDI transmission. 48 Wait queue for MIDI transmission.