Subject: Re: newlock
To: Garrett D'Amore <garrett_damore@tadpole.com>
From: Andrew Doran <ad@NetBSD.org>
List: tech-kern
Date: 09/04/2006 03:03:18
Hi Garrett,
On Sun, Sep 03, 2006 at 05:28:22PM -0700, Garrett D'Amore wrote:
> What's wrong with the standard solaris way of doing this?
>
> mutex_enter(a);
> find b...
> mutex_enter(b);
> /* possibly unlock a now *
> mutex_exit(b);
> mutex_exit(a); /* unless you did it earlier */
>
> It gives full flexibility, and keeps everything explicit.
If releasing spin mutexes out of order, then we restore the saved SPL too
early and there's a short window where an interrupt can fire and we deadlock
on the mutex:
mutex_enter(a) <- original interrupt mask saved
mutex_enter(b)
...
mutex_exit(a) <- original interrupt mask restored
mutex_exit(b) <- deadlock
The question is: how to allow that cleanly? I don't know how Solaris handles
that with spin mutexes. From what I know, I doubt it does..
Thanks,
Andrew