Subject: Re: newlock
To: Garrett D'Amore <garrett_damore@tadpole.com>
From: Bill Studenmund <wrstuden@netbsd.org>
List: tech-kern
Date: 09/05/2006 15:40:39
--DqhR8hV3EnoxUkKN
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable
On Mon, Sep 04, 2006 at 01:35:02PM -0700, Garrett D'Amore wrote:
> David Laight wrote:
> > On Sun, Sep 03, 2006 at 07:31:55PM -0700, Garrett D'Amore wrote:
> > =20
> >> Wrong. This works fine in Solaris. The spin mutex doesn't
> >> automatically release the spl -- instead it releases a _reference_ on
> >> the spl. The spl is only dropped when the reference reaches zero.
> >
> > I've never seen that behaviour documented for Solaris...
>=20
> It wouldn't be "documented", because that would be an internal
> implementation detail.
>=20
> I'm now looking the code, and I'm not so sure. I had always assumed it
> this to be this way, but reading the Solaris code, it looks like I could
> be wrong here. If that's true, then there are a lot of buggy Solaris
> drivers out there, including one or two that I've written. :-(
>=20
> I'm going to investigate this further.
Please do. This issue is very interesting to me. ;-)
> > OTOH the last solaris drivers I wrote were for 2.5 or 2.6.
> > I also remember it being an absolute pain that you couldn't mask interr=
upts
> > unless yoiu were in the driver that attached t hISR.
> > =20
>=20
> Masking interrupts doesn't work on very high end SMP hardware. You're
> still trying to design for systems with less than 8 CPUs.
>=20
> The only reason you want to block an interrupt is to keep an ISR from
> clobbering some shared state. So you have a mutex that has the iblock
> cookie set, which blocks the interrupt for you. You can acquire these
> mutexes anywhere (except a higher priority ISR than what you declared at
> mutex creation time!)
I think that's what we've been talking about when we say, "blocking=20
interrupts." You're right that we only mask on one CPU; we keep the ISR=20
from running on our head. If it's on a different head, it has to wait for=
=20
us before starting.
> The system takes care of ensuring that the ISR can't run during this time.
>=20
> "Masking interrupts" is the old BSD uniprocessor way of thinking.=20
> Solaris is better. Trust me.
I think we are all on the same page here.
What I am interested in is if there is any provision in the solaris model=
=20
for the lock handoff that ad mentioned. Something where we have two=20
mutexes with "iblock cookies" to quote the above. We start with mutex a=20
locked, but then need to hand off to mutex b. How does Solaris do this?
These scenarios come up in cases where one protocol masks for another.=20
Like ppp or slip, where the data come in on a serial port (spltty() in our=
=20
parlance) but get processed by the networking stack (splnet()). And stuff=
=20
from the networking stack gets processed by serial hardware (going=20
splnet() to spltty()).
Another would be an iSCSI initiator where splbio() and splnet() get
mingled. And heven help someone trying to do iSCSI over ppp. :-)
Other examples would be (could be) where vnd on NFS mingles splbio() and=20
splnet().
Take care,
Bill
--DqhR8hV3EnoxUkKN
Content-Type: application/pgp-signature
Content-Disposition: inline
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.3 (NetBSD)
iD8DBQFE/fznWz+3JHUci9cRAn/mAJ9/1yYutqTHpcNvxEsQiExi0NbxyQCgloKJ
6evCqhH3Ctm5BJFIetPYDMg=
=NJxI
-----END PGP SIGNATURE-----
--DqhR8hV3EnoxUkKN--