Fwd: SPLs and their ex-function / replacement

Matthew Dillon dillon at apollo.backplane.com
Tue Sep 20 23:42:04 PDT 2005


Hi, I remember that SPLs were removed from DragonFlyBSD, but having readwhat
they are for (setting the various priority levels on interruptprocessing 
code so things are processed in the right order wheninterrupts/traps are
received), I wondered how replacing them with asingle tier of critical
sections works?

    For all intents and purposes there is no difference in performance,
    because critical sections are not typically held long enough for the
    additional latency to be noticeable.

    SPLs were never designed to deal with SMP systems so they have to 
    go no matter what.  Critical sections only protect against interrupts
    on the cpu entering the critical section, not on the other cpus.  The
    SPL->critical section change is therefore a temporary measure.

    Ultimately interrupts will have to use a serializing lock for interlocks.
    currently the EM driver (/usr/src/sys/dev/netif/em/if_em.c) is the only
    driver doing this (as a test).  On SMP systems the kernel is still
    using the Big Giant Lock for most things, including interrupts, and
    this effectively forces mainline kernel code and interrupt code to
    run on the same cpu, so critical sections have the proper effect
    until we can move to a better model.

Are there some interruptpriorities hard coded into the 
LWKT scheduler on each CPU? Also, just wondering how the above relates to 
converting the interruptprocessing stuff to run in a thread context for 
each driver...doesthat allow interrupts to be scheduled by normal means
(I would guessLWKT) rather than having a special mechanism? 

    The LWKT scheduler is a fixed priority scheduler with 32 priority
    levels.  Three of the higher priority levels are reserved for use
    by interrupt threads.  Generally speaking, the actual hard interrupt
    does nothing more then schedule the interrupt thread.  The interrupt
    can preempt lower priority thread and thus runs almost immediately
    (unless blocked by a critical section).

    The interupt thread abstraction does allow one interrupt thread to
    preempt another interrupt thread if it is at a higher priority, but
    at the moment nearly all of our interrupt threads run at the same
    priority.  Most modern I/O devices are DMA driven so interrupt latency
    isn't as important anymore.  The one exception is the serial port,
    but even there the serial FIFOs are large enough to handle quite a bit
    of latency without overflowing.

Thank you for
putting up with these sorts of questions, I am trying toget my head around
operating systems and some of the approaches inDragonFlyBSD are really novel 
so I cant find much information aboutthem. Thanks in advance, Alex Burke.

					-Matt
					Matthew Dillon 
					<dillon at xxxxxxxxxxxxx>





More information about the Kernel mailing list