Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 31 Oct 2002 11:46:04 +1100
From:      Gregory Bond <gnb@itga.com.au>
To:        Andriy Gapon <avg@icyb.net.ua>
Cc:        freebsd-bugs@FreeBSD.ORG
Subject:   Re: kern/44417: ipfw layer2 rules are not checked for ether_output_frame() on bridged interface 
Message-ID:  <200210310046.LAA06800@lightning.itga.com.au>
In-Reply-To: Your message of Wed, 30 Oct 2002 16:20:03 -0800.

next in thread | raw e-mail | index | archive | help
>  Btw, could you please educate me a little bit about this splXXX() stuff ?
>  I've tried to understand it from man page, but failed...
>  What purpose does it serve here ? Is this like some kind of locking ?

Yep.  If you have data structures that might be modified by both system calls 
and interrupts (e.g. send/receive lists from network adaptors), then you need 
to make sure the interrupt doesn't happen while the system call is in the 
middle of modifying the data.  This is achieved by 3 steps:

 - Choosing a "name" for this spl ("splnet" in this case)

 - Making the interrupt only happen when "splnet" is not active.  This is 
   actually done (I think) by checking the spl list in the hardware 
   interrupt routine and dispatching to the interrupt handler if splnet is not 
   active, or queueing an interrupt service request if splnet is active.  The 
   association of hardware device interrupt to spl is done via the config file 
   (the "tty" or "net" keywords, tho these days they are almost all just 
   defaulted based on device type.)

   In the old days, on the early PDP-11 Unix versions, this was done with
   hardware interrupt masks, and the various splXXX() levels had a strict
   hierarchy, so spltty() meant "don't enable tty interrupts, but let net and 
   bio interrupts happen", but splbio() meant "Don't enable any interrupts at
   all."

 - The code called from the system calls then does the following:
 	s = splnet()
	// Do stuff with data structures
	splx(s)
    This ensures the interrupt can't be services while the data structures are 
    being updated by the system calls.  The splXXX() routines return the 
    current spl status, then set the named spl as active.  splx() means 
    "return to the previous interrupt state" and (I think) will also cause 
    any device interrupts that were queued while splnet() was active to be 
    processed.

Note that there are no actual semaphores/spinlocks here, it's all done either
with hardware interrupt masks or simple queues.

Of course, in an SMP system, this all gets much harder.  I dunno how the 
FreeBSD 5 kernel handles SPLs.




To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200210310046.LAA06800>