lock order reversal
Jan-Espen Pettersen
sigsegv at leakingmemory.org
Wed Apr 30 13:20:36 PDT 2003
On Wednesday 30 April 2003 18:28, Georg Funk wrote:
> hm, the patch doesn't seem to work:
>
> --------------------------------------------------
> #patch < pcm.diff
> Hmm... Looks like a normal diff to me...
> The text leading up to this was:
> --------------------------
>
> |cvs diff: Diffing sys/dev/sound/pcm
> |Index: sys/dev/sound/pcm/dsp.c
> |===================================================================
> |RCS file:
>
> /old/pub/FreeBSD/development/FreeBSD-CVS/src/sys/dev/sound/pcm/dsp.c,v
>
> |retrieving revision 1.62
> |diff -r1.62 dsp.c
>
> --------------------------
> Patching file dsp.c using Plan A...
> Hunk #1 failed at 265.
> Hunk #2 failed at 270.
> Hunk #3 failed at 287.
> Hunk #4 succeeded at 304.
> 3 out of 4 hunks failed--saving rejects to dsp.c.rej
> done
>
> On Wednesday 30 April 2003 16:33, you wrote:
> > On Wednesday 30 April 2003 14:55, Georg Funk wrote:
> > > Hi!
> > > I'm running the FreeBSD 5.0-RELEASE. When I boot up, this appears:
> > >
> > > 1st 0xc12a7230 process lock (process lock) @
> > > ../../../kern/kern_descrip.c:2112 lock order reversal
> > > I haven't noticed any disfunctions, but what does this mean?
> > >
> > > I get a similar error when I use my soundcard:
> > >
> > > lock order reversal
> > > 1st 0xc120a680 pcm0 (sound softc) @ ../../../dev/sound/isa/mss.c:177
> > > 2nd 0xc120a740 pcm0:play:0 (pcm channel) @
> > > ../../../dev/sound/pcm/channel.c:441
> > >
> > > I have to restart the KDE artsd before the soundcard works correct.
> > > Please give me advice how to solve this.
> > >
> > > Thanks in advance, Georg Funk
> >
> > I have also seen that problem, and this patch seems to work here..
> > It is probably not very optimized, but the lock order reversal didn't
> > show up again...
> >
> > cvs diff: Diffing sys/dev/sound/pcm
> > Index: sys/dev/sound/pcm/dsp.c
> > ===================================================================
> > RCS file:
> > /old/pub/FreeBSD/development/FreeBSD-CVS/src/sys/dev/sound/pcm/dsp.c,v
> > retrieving revision 1.62
> > diff -r1.62 dsp.c
> > 265,266c265
> > < pcm_unlock(d);
> > < /* finished with snddev, new channels still locked */
> > ---
> >
> > > /* keep the snddev lock to avoid a lock order reversal, new
> > > channels still locked */
> >
> > 271d269
> > < pcm_lock(d);
> > 289d286
> > < pcm_lock(d);
> > 306a304
> >
> > > pcm_unlock(d);
> >
Sorry, I was in a hurry. I was supposed to be at work 30 minutes later...
This one should work:
--- dsp.c Wed Apr 30 22:15:50 2003
+++ /home/sigsegv/pcm/dsp.c Wed Apr 30 21:55:38 2003
@@ -262,13 +262,11 @@
i_dev->si_drv1 = rdch;
i_dev->si_drv2 = wrch;
- pcm_unlock(d);
- /* finished with snddev, new channels still locked */
+ /* keep the snddev lock to avoid a lock order reversal, new channels
still locked */
/* bump refcounts, reset and unlock any channels that we just opened
*/
if (flags & FREAD) {
if (chn_reset(rdch, fmt)) {
- pcm_lock(d);
pcm_chnrelease(rdch);
i_dev->si_drv1 = NULL;
if (wrch && (flags & FWRITE)) {
@@ -286,7 +284,6 @@
}
if (flags & FWRITE) {
if (chn_reset(wrch, fmt)) {
- pcm_lock(d);
pcm_chnrelease(wrch);
i_dev->si_drv2 = NULL;
if (flags & FREAD) {
@@ -304,6 +301,7 @@
pcm_chnref(wrch, 1);
CHN_UNLOCK(wrch);
}
+ pcm_unlock(d);
splx(s);
return 0;
}
More information about the freebsd-current
mailing list