Subject: spl naming etc
To: None <tech-kern@NetBSD.ORG>
From: Arne H. Juul <arnej@pvv.unit.no>
List: tech-kern
Date: 01/03/1996 01:39:03
(This discussion comes from port-pmax.  I hope it's ok for me
to move it here instead, since it's no longer pmax-specific).

Let me summarize a bit:

splimp() currently has two uses (quoted from Charles):

 a) > Serialize access to malloc() and free().

 b) > Because of SLIP and PPP, network drivers (and thus manipulation of
    > protocol queues) can run at both spltty() and splnet().  Therefore,
    > manipulation of protocol queues is done at splimp() to prevent
    > reentrance.

This is probably historical:  The spl used to be 'levels' in a priority
hierarchy, where splimp() was at a suitable point in the hierarchy to
use it for malloc()/free().  [Those with more 'history' please correct
if this is wrong.]

But in NetBSD the current spl() structure is not strictly hierarchic;
splnet() can block just network interrupts, splbio() just disk interrupts,
spltty() just serial interrupts and so on.  [This is a simplified picture
of course, ignoring parallel ports etc...] At least this is my current
understanding of the NetBSD source code.  Of course many machines must
have the spl() routines in a hierarchy anyway, because of the hardware
construction.

So maybe we *really* should have split splimp() into splprotoqueue()
and splmalloc(), if we wanted to be "pure" (arpanet is dead, after all).
However, this is probably not a good idea since it would break a lot of
device-driver / kernel source code compabitibility.

So, what we need to do is ask:
 - does lots of people / drivers / other bsd operating systems assume
splimp() can/should be used to block malloc, and use it for that purpose?
[I don't know the answer to this.]

If not, we *can* split splimp() into slightly modified splimp() blocking
net/tty, and splmalloc() blocking 'all-drivers-using-malloc()' (whatever
that may mean).  Of course, on many machines these two might have the
same implementation, but if there are some machines where it makes for
a huge win, it should be considered.  I don't know whether it would be
a huge win, a small win, or no win at all.

I'm pretty sure renaming splimp() in the network code would be a very
very bad idea.  (No, "splprotoqueue" is *not* seriously meant.)

However, if the current dual-purpose splimp() is kept, it needs to
be documented as such, since it seems most people [including me, after
having read a bit in the Stevens/Wright book] assumed it did just b) above.
I'll volunteer to write the man page.

Now what about another (maybe stupid) idea:  Most boxes doesn't
necessarily run slip or ppp at all.  What about making splimp() not
block tty interrupts if slip/ppp is not configured?  This *might*
be a huge win on many machines for serial port reliability, which
would be nice for driving printers / terminals.  [Of course, you need
serial port reliability when using slip/ppp too!]

  -  Arne H. J.