Subject: Re: SMP re-entrancy in kernel drivers/"bottom half?"
To: Jason Thorpe <thorpej@wasabisystems.com>
From: Jonathan Stone <jonathan@dsg.stanford.edu>
List: tech-kern
Date: 12/17/2003 19:18:50
In message <ECF1DBA0-3105-11D8-91BB-000A957650EC@wasabisystems.com>,
Jason Thorpe writes:


>The hierarchy of simplelocks is simply not an acceptable solution:

s/strict hierarcy/whatever we have now/, then. That was all I really
meant. I hadnt noticed the splclock() changes. 

(Forgive me if I dont pay attention to Events that at 100Hz when I'm
focusing on event sthat hapen at several tens of KHz per device, with
mulpitle such devices per system.)


>	3. I'm not seeing how it would actually solve your problem.  If you
>	   want to have 2 CPUs handling NIC interrupts, they would both have
>	   to acquire the IPL_NET_slock, which would stall one of them.

Err, no, I must have phrased it carelessly: thats precisely
what I *dont* want. See below.

[..]


>What have I missed?

Interrupt handler woudn't aquire the IP_NET_slock. They acquire just
the lock for a given different softc, when they enter the device
interrupt handler _for that device_.  They dont need to get the
IPL_NET lock until they need to touch datastructures outside the
device softc itself (say for a NIC driver, dropping a packet on the ip
(or other) input queue.)

Reordered slightly:

>	4. Having to acquire several simplelocks in a hierarchy would increase
>	   the interrupt latency.
>

Nope, the `hierarchy' (modified above to `emulate whatever we have
now') was for IPLs *above* device interrupts.

I suggested the interrupt glue will know whether an interrupt routine
was SMP-safe before entering it (from a flag provided by the device,
when it registered the interrupt).

If we changed the argument to an (SMP-safe) interrupt routine from a
void * to a struct device * (or an extension of struct device), then
the per-device spinlock could be part of struct device, and the
interrupt glue could test or acquire the per-softc lock before
entering the driver. I'm agnostic about doing that versus spinning in
the very beginning of the interrupt hanlder.

If and when the driver needs IP_NET_slock, to touch something outside
the softc, it can attempt to obtain it.

Yamamoto-san already suggested doing away wiht per-IP locks and just
using kernel_lock. smp-intr-save drivers would then attempt to acquire
kernel_lock before they reach into data structures outside the softc.

I said I though that should work, too. but it seems a (small) step in
the wrong direction, too: we want finer-grained locks, not yet more
use of kernel_lock.