From: "Jörn Nettingsmeier" <nettings@stackingdwarves.net>
To: Takashi Iwai <tiwai@suse.de>
Cc: Adrian Knoth <adi@drcomp.erfurt.thur.de>, alsa-devel@alsa-project.org
Subject: Re: [PATCH] RME HDSPM MADI lock fix
Date: Tue, 07 Jun 2011 10:33:55 +0200 [thread overview]
Message-ID: <4DEDE273.9060200@stackingdwarves.net> (raw)
In-Reply-To: <s5hk4cz1gae.wl%tiwai@suse.de>
[-- 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 --]
next prev parent reply other threads:[~2011-06-07 8:27 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
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 [this message]
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
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4DEDE273.9060200@stackingdwarves.net \
--to=nettings@stackingdwarves.net \
--cc=adi@drcomp.erfurt.thur.de \
--cc=alsa-devel@alsa-project.org \
--cc=tiwai@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.