* [PATCH] RME HDSPM MADI lock fix
@ 2011-06-05 9:57 Jörn Nettingsmeier
2011-06-06 9:05 ` Takashi Iwai
0 siblings, 1 reply; 8+ messages in thread
From: Jörn Nettingsmeier @ 2011-06-05 9:57 UTC (permalink / raw)
To: alsa-devel, Takashi Iwai, Adrian Knoth
[-- Attachment #1: Type: text/plain, Size: 1941 bytes --]
hi *!
while we were trying to debug the midi-related xruns in the current
driver, i came across what looks like an unrelated locking bug to me:
static int snd_hdspm_midi_input_read (struct hdspm_midi *hmidi)
...
spin_lock_irqsave (&hmidi->lock, flags); <---------------
n_pending = snd_hdspm_midi_input_available (hmidi->hdspm,
hmidi->id);
if (n_pending > 0) {
if (hmidi->input) {
if (n_pending > (int)sizeof (buf))
n_pending = sizeof (buf);
for (i = 0; i < n_pending; ++i)
buf[i] = snd_hdspm_midi_read_byte
(hmidi->hdspm,
hmidi->id);
if (n_pending)
snd_rawmidi_receive (hmidi->input, buf,
n_pending);
} else {
/* flush the MIDI input FIFO */
while (n_pending--)
snd_hdspm_midi_read_byte (hmidi->hdspm,
hmidi->id);
}
}
hmidi->pending = 0;
hmidi->hdspm->control_register |= hmidi->ie;<------- !!!
hdspm_write(hmidi->hdspm, HDSPM_controlRegister,
hmidi->hdspm->control_register);
spin_unlock_irqrestore (&hmidi->lock, flags);<---------
return snd_hdspm_midi_output_write (hmidi);
}
if i understand this whole business correctly, we should be holding the
hdspm lock here, not the hmidi one.
please review the attached patch and apply if you think it's ok.
best,
jörn
--
Jörn Nettingsmeier
Lortzingstr. 11, 45128 Essen, Tel. +49 177 7937487
Meister für Veranstaltungstechnik (Bühne/Studio)
Tonmeister (VDT)
http://stackingdwarves.net
[-- Attachment #2: hdspm-lockfix.diff --]
[-- Type: text/x-patch, Size: 663 bytes --]
--- sound/pci/rme9652/hdspm.c~ 2011-06-01 21:30:24.000000000 +0200
+++ sound/pci/rme9652/hdspm.c 2011-06-01 22:04:08.184946711 +0200
@@ -1619,7 +1619,7 @@
int n_pending;
int i;
- spin_lock_irqsave (&hmidi->lock, flags);
+ spin_lock_irqsave (&hmidi->hdspm->lock, flags);
n_pending = snd_hdspm_midi_input_available (hmidi->hdspm, hmidi->id);
if (n_pending > 0) {
if (hmidi->input) {
@@ -1644,7 +1644,7 @@
hdspm_write(hmidi->hdspm, HDSPM_controlRegister,
hmidi->hdspm->control_register);
- spin_unlock_irqrestore (&hmidi->lock, flags);
+ spin_unlock_irqrestore (&hmidi->hdspm->lock, flags);
return snd_hdspm_midi_output_write (hmidi);
}
[-- Attachment #3: Type: text/plain, Size: 0 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] RME HDSPM MADI lock fix
2011-06-05 9:57 [PATCH] RME HDSPM MADI lock fix Jörn Nettingsmeier
@ 2011-06-06 9:05 ` Takashi Iwai
2011-06-07 8:33 ` Jörn Nettingsmeier
0 siblings, 1 reply; 8+ messages in thread
From: Takashi Iwai @ 2011-06-06 9:05 UTC (permalink / raw)
To: Jörn Nettingsmeier; +Cc: Adrian Knoth, alsa-devel
At Sun, 05 Jun 2011 11:57:57 +0200,
Jörn Nettingsmeier wrote:
>
> hi *!
>
> while we were trying to debug the midi-related xruns in the current
> driver, i came across what looks like an unrelated locking bug to me:
>
> static int snd_hdspm_midi_input_read (struct hdspm_midi *hmidi)
> ...
> spin_lock_irqsave (&hmidi->lock, flags); <---------------
> n_pending = snd_hdspm_midi_input_available (hmidi->hdspm,
> hmidi->id);
> if (n_pending > 0) {
> if (hmidi->input) {
> if (n_pending > (int)sizeof (buf))
> n_pending = sizeof (buf);
> for (i = 0; i < n_pending; ++i)
> buf[i] = snd_hdspm_midi_read_byte
> (hmidi->hdspm,
>
> hmidi->id);
> if (n_pending)
> snd_rawmidi_receive (hmidi->input, buf,
> n_pending);
> } else {
> /* flush the MIDI input FIFO */
> while (n_pending--)
> snd_hdspm_midi_read_byte (hmidi->hdspm,
> hmidi->id);
> }
> }
> hmidi->pending = 0;
>
> hmidi->hdspm->control_register |= hmidi->ie;<------- !!!
> hdspm_write(hmidi->hdspm, HDSPM_controlRegister,
> hmidi->hdspm->control_register);
>
> spin_unlock_irqrestore (&hmidi->lock, flags);<---------
> return snd_hdspm_midi_output_write (hmidi);
> }
>
>
> if i understand this whole business correctly, we should be holding the
> hdspm lock here, not the hmidi one.
>
> please review the attached patch and apply if you think it's ok.
Well, it's a wrong lock for snd_hdspm_midi_input_available().
So you'll need to lock twice, either once unlock and lock another or
nested. Re-locking would be less messy in this case, I suppose.
thanks,
Takashi
>
>
> best,
>
>
> jörn
>
>
>
> --
> Jörn Nettingsmeier
> Lortzingstr. 11, 45128 Essen, Tel. +49 177 7937487
>
> Meister für Veranstaltungstechnik (Bühne/Studio)
> Tonmeister (VDT)
>
> http://stackingdwarves.net
> [2 hdspm-lockfix.diff <text/x-patch (7bit)>]
> --- sound/pci/rme9652/hdspm.c~ 2011-06-01 21:30:24.000000000 +0200
> +++ sound/pci/rme9652/hdspm.c 2011-06-01 22:04:08.184946711 +0200
> @@ -1619,7 +1619,7 @@
> int n_pending;
> int i;
>
> - spin_lock_irqsave (&hmidi->lock, flags);
> + spin_lock_irqsave (&hmidi->hdspm->lock, flags);
> n_pending = snd_hdspm_midi_input_available (hmidi->hdspm, hmidi->id);
> if (n_pending > 0) {
> if (hmidi->input) {
> @@ -1644,7 +1644,7 @@
> hdspm_write(hmidi->hdspm, HDSPM_controlRegister,
> hmidi->hdspm->control_register);
>
> - spin_unlock_irqrestore (&hmidi->lock, flags);
> + spin_unlock_irqrestore (&hmidi->hdspm->lock, flags);
> return snd_hdspm_midi_output_write (hmidi);
> }
>
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] RME HDSPM MADI lock fix
2011-06-06 9:05 ` Takashi Iwai
@ 2011-06-07 8:33 ` Jörn Nettingsmeier
2011-06-07 8:38 ` Adrian Knoth
2011-06-07 9:28 ` Takashi Iwai
0 siblings, 2 replies; 8+ messages in thread
From: Jörn Nettingsmeier @ 2011-06-07 8:33 UTC (permalink / raw)
To: Takashi Iwai; +Cc: Adrian Knoth, alsa-devel
[-- Attachment #1: Type: text/plain, Size: 1674 bytes --]
On 06/06/2011 11:05 AM, Takashi Iwai wrote:
> At Sun, 05 Jun 2011 11:57:57 +0200,
> Jörn Nettingsmeier wrote:
>>
>> hi *!
>>
>> while we were trying to debug the midi-related xruns in the current
>> driver, i came across what looks like an unrelated locking bug to me:
>>
>> static int snd_hdspm_midi_input_read (struct hdspm_midi *hmidi)
>> ...
>> spin_lock_irqsave (&hmidi->lock, flags);<---------------
>> n_pending = snd_hdspm_midi_input_available (hmidi->hdspm,
>> hmidi->id);
>> ...
>> hmidi->pending = 0;
>>
>> hmidi->hdspm->control_register |= hmidi->ie;<------- !!!
>> hdspm_write(hmidi->hdspm, HDSPM_controlRegister,
>> hmidi->hdspm->control_register);
>>
>> spin_unlock_irqrestore (&hmidi->lock, flags);<---------
>> return snd_hdspm_midi_output_write (hmidi);
>> }
>>
>>
>> if i understand this whole business correctly, we should be holding the
>> hdspm lock here, not the hmidi one.
>>
>> please review the attached patch and apply if you think it's ok.
>
> Well, it's a wrong lock for snd_hdspm_midi_input_available().
> So you'll need to lock twice, either once unlock and lock another or
> nested. Re-locking would be less messy in this case, I suppose.
ok, here's a revised patch. has been running for 20 or so hours without
problems, although the load was light most of the time.
please consider for inclusion.
best,
jörn
--
Jörn Nettingsmeier
Lortzingstr. 11, 45128 Essen, Tel. +49 177 7937487
Meister für Veranstaltungstechnik (Bühne/Studio)
Tonmeister (VDT)
http://stackingdwarves.net
[-- Attachment #2: hdspm-lock-fix.diff --]
[-- Type: text/x-patch, Size: 612 bytes --]
--- linux-2.6.39/sound/pci/rme9652/hdspm.c.orig 2011-05-19 06:06:34.000000000 +0200
+++ linux-2.6.39/sound/pci/rme9652/hdspm.c 2011-06-07 10:26:35.778933230 +0200
@@ -1639,12 +1639,14 @@
}
}
hmidi->pending = 0;
+ spin_unlock_irqrestore (&hmidi->lock, flags);
+ spin_lock_irqsave (&hmidi->hdspm->lock, flags);
hmidi->hdspm->control_register |= hmidi->ie;
hdspm_write(hmidi->hdspm, HDSPM_controlRegister,
hmidi->hdspm->control_register);
+ spin_unlock_irqrestore (&hmidi->hdspm->lock, flags);
- spin_unlock_irqrestore (&hmidi->lock, flags);
return snd_hdspm_midi_output_write (hmidi);
}
[-- Attachment #3: Type: text/plain, Size: 0 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] RME HDSPM MADI lock fix
2011-06-07 8:33 ` Jörn Nettingsmeier
@ 2011-06-07 8:38 ` Adrian Knoth
2011-06-07 9:28 ` Takashi Iwai
1 sibling, 0 replies; 8+ messages in thread
From: Adrian Knoth @ 2011-06-07 8:38 UTC (permalink / raw)
To: Jörn Nettingsmeier; +Cc: Takashi Iwai, alsa-devel
On Tue, Jun 07, 2011 at 10:33:55AM +0200, Jörn Nettingsmeier wrote:
> --- linux-2.6.39/sound/pci/rme9652/hdspm.c.orig 2011-05-19 06:06:34.000000000 +0200
> +++ linux-2.6.39/sound/pci/rme9652/hdspm.c 2011-06-07 10:26:35.778933230 +0200
> @@ -1639,12 +1639,14 @@
> }
> }
> hmidi->pending = 0;
> + spin_unlock_irqrestore (&hmidi->lock, flags);
>
> + spin_lock_irqsave (&hmidi->hdspm->lock, flags);
> hmidi->hdspm->control_register |= hmidi->ie;
> hdspm_write(hmidi->hdspm, HDSPM_controlRegister,
> hmidi->hdspm->control_register);
> + spin_unlock_irqrestore (&hmidi->hdspm->lock, flags);
>
> - spin_unlock_irqrestore (&hmidi->lock, flags);
> return snd_hdspm_midi_output_write (hmidi);
> }
>
This looks sane to me. I'll add it to my git repo and will re-post it
together with the upcoming changes for the iosono guys once we're
finished.
Cheers
--
mail: adi@thur.de http://adi.thur.de PGP/GPG: key via keyserver
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] RME HDSPM MADI lock fix
2011-06-07 8:33 ` Jörn Nettingsmeier
2011-06-07 8:38 ` Adrian Knoth
@ 2011-06-07 9:28 ` Takashi Iwai
2011-06-07 9:30 ` Adrian Knoth
1 sibling, 1 reply; 8+ messages in thread
From: Takashi Iwai @ 2011-06-07 9:28 UTC (permalink / raw)
To: Jörn Nettingsmeier; +Cc: Adrian Knoth, alsa-devel
At Tue, 07 Jun 2011 10:33:55 +0200,
Jörn Nettingsmeier wrote:
>
> On 06/06/2011 11:05 AM, Takashi Iwai wrote:
> > At Sun, 05 Jun 2011 11:57:57 +0200,
> > Jörn Nettingsmeier wrote:
> >>
> >> hi *!
> >>
> >> while we were trying to debug the midi-related xruns in the current
> >> driver, i came across what looks like an unrelated locking bug to me:
> >>
> >> static int snd_hdspm_midi_input_read (struct hdspm_midi *hmidi)
> >> ...
> >> spin_lock_irqsave (&hmidi->lock, flags);<---------------
> >> n_pending = snd_hdspm_midi_input_available (hmidi->hdspm,
> >> hmidi->id);
> >> ...
> >> hmidi->pending = 0;
> >>
> >> hmidi->hdspm->control_register |= hmidi->ie;<------- !!!
> >> hdspm_write(hmidi->hdspm, HDSPM_controlRegister,
> >> hmidi->hdspm->control_register);
> >>
> >> spin_unlock_irqrestore (&hmidi->lock, flags);<---------
> >> return snd_hdspm_midi_output_write (hmidi);
> >> }
> >>
> >>
> >> if i understand this whole business correctly, we should be holding the
> >> hdspm lock here, not the hmidi one.
> >>
> >> please review the attached patch and apply if you think it's ok.
> >
> > Well, it's a wrong lock for snd_hdspm_midi_input_available().
> > So you'll need to lock twice, either once unlock and lock another or
> > nested. Re-locking would be less messy in this case, I suppose.
>
> ok, here's a revised patch. has been running for 20 or so hours without
> problems, although the load was light most of the time.
>
> please consider for inclusion.
Looks good. But please give a proper changelog and your sign-off
for inclusion.
thanks,
Takashi
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] RME HDSPM MADI lock fix
2011-06-07 9:28 ` Takashi Iwai
@ 2011-06-07 9:30 ` Adrian Knoth
2011-06-07 9:37 ` Takashi Iwai
0 siblings, 1 reply; 8+ messages in thread
From: Adrian Knoth @ 2011-06-07 9:30 UTC (permalink / raw)
To: Takashi Iwai; +Cc: alsa-devel, Jörn Nettingsmeier
On 06/07/2011 11:28 AM, Takashi Iwai wrote:
>>> Well, it's a wrong lock for snd_hdspm_midi_input_available().
>>> So you'll need to lock twice, either once unlock and lock another or
>>> nested. Re-locking would be less messy in this case, I suppose.
>> ok, here's a revised patch. has been running for 20 or so hours without
>> problems, although the load was light most of the time.
>>
>> please consider for inclusion.
>
> Looks good. But please give a proper changelog and your sign-off
> for inclusion.
I've handled this. I take care of everything, commit (with changelog and
sign-off) to my git repo and will send the final patch series to the
list once it's ready.
Cheers
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] RME HDSPM MADI lock fix
2011-06-07 9:30 ` Adrian Knoth
@ 2011-06-07 9:37 ` Takashi Iwai
2011-06-07 9:41 ` Adrian Knoth
0 siblings, 1 reply; 8+ messages in thread
From: Takashi Iwai @ 2011-06-07 9:37 UTC (permalink / raw)
To: Adrian Knoth; +Cc: alsa-devel, Jörn Nettingsmeier
At Tue, 07 Jun 2011 11:30:28 +0200,
Adrian Knoth wrote:
>
> On 06/07/2011 11:28 AM, Takashi Iwai wrote:
>
> >>> Well, it's a wrong lock for snd_hdspm_midi_input_available().
> >>> So you'll need to lock twice, either once unlock and lock another or
> >>> nested. Re-locking would be less messy in this case, I suppose.
> >> ok, here's a revised patch. has been running for 20 or so hours without
> >> problems, although the load was light most of the time.
> >>
> >> please consider for inclusion.
> >
> > Looks good. But please give a proper changelog and your sign-off
> > for inclusion.
>
> I've handled this. I take care of everything, commit (with changelog and
> sign-off) to my git repo and will send the final patch series to the
> list once it's ready.
OK, thanks.
(Note that usually a patch always requires the sign-off of the
original author, no matter who commits. But in this case, it doesn't
matter much because the patch is trivial.)
Takashi
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] RME HDSPM MADI lock fix
2011-06-07 9:37 ` Takashi Iwai
@ 2011-06-07 9:41 ` Adrian Knoth
0 siblings, 0 replies; 8+ messages in thread
From: Adrian Knoth @ 2011-06-07 9:41 UTC (permalink / raw)
To: Takashi Iwai; +Cc: alsa-devel, Jörn Nettingsmeier
On 06/07/2011 11:37 AM, Takashi Iwai wrote:
>>> Looks good. But please give a proper changelog and your sign-off
>>> for inclusion.
>>
>> I've handled this. I take care of everything, commit (with changelog and
>> sign-off) to my git repo and will send the final patch series to the
>> list once it's ready.
>
> OK, thanks.
>
> (Note that usually a patch always requires the sign-off of the
> original author, no matter who commits. But in this case, it doesn't
> matter much because the patch is trivial.)
That's exactly how I did it: Sign-off by Jörn and a second line by me.
Since it's his work and we're not talking about cryptographic
signatures, I took the liberty to provide the correct attribution.
Cheers
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2011-06-07 9:41 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-06-05 9:57 [PATCH] RME HDSPM MADI lock fix Jörn Nettingsmeier
2011-06-06 9:05 ` Takashi Iwai
2011-06-07 8:33 ` Jörn Nettingsmeier
2011-06-07 8:38 ` Adrian Knoth
2011-06-07 9:28 ` Takashi Iwai
2011-06-07 9:30 ` Adrian Knoth
2011-06-07 9:37 ` Takashi Iwai
2011-06-07 9:41 ` Adrian Knoth
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.