Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 3 May 2004 13:09:59 -0400 (EDT)
From:      Robert Watson <rwatson@freebsd.org>
To:        Bruce Evans <bde@zeta.org.au>
Cc:        "M. Warner Losh" <imp@bsdimp.com>
Subject:   Re: sio: lots of silo overflows on Asus K8V with Moxa Smartio C104H/PCI
Message-ID:  <Pine.NEB.3.96L.1040503130429.95554B-100000@fledge.watson.org>
In-Reply-To: <20040503131929.K3770@gamplex.bde.org>

next in thread | previous in thread | raw e-mail | index | archive | help

On Mon, 3 May 2004, Bruce Evans wrote:

> On Sun, 2 May 2004, M. Warner Losh wrote:
> 
> > In message: <20040502130027.O1806@gamplex.bde.org>
> >             Bruce Evans <bde@zeta.org.au> writes:
> > : No, but siointr() doesn't go near the tty layer or almost any other
> > : layer.  It uses pseudo-dma and schedules a SWI to transfer data between
> > : its buffers and the tty layer.  Fast interrupt handlers cannot call
> > : other layers because they cannot reasonable lock other layers or
> > : vice versa.  (Even the call to the scheduler to schedule a SWI in the
> > : current implementation is a layering violation.)
> >
> > So it is also safe to call the tty layer w/o giant held from the SWI?
> > I guess that was my question.  Or is the SWI wrapped in Giant when I
> > wasn't looking...
> 
> Unsafe.  SWIs are wrapped by Giant unless they are created using
> swi_add(... INTR_MPSAFE ...).  There are 26 calls to swi_add() in the
> tree, and the slow progress of Giant removal is shown by only 3 of
> these using INTR_MPSAFE.  The ones in sio are not in the 3.  The 3
> are all just for multiplexors that push down deciding whether to use
> Giant to lower layers:

Actually, it's a little more complex than that: most of the callers if
swi_add() with INTR_MPSAFE are actually via bus_setup_intr() which accepts
similar flags.  You'll find that a much larger number of interrupts are
capable of running mpsafe if you search for that.  Also, unless
debug.mpsafenet is turned on, the interrupt setup code will ignore the
INTR_MPSAFE flag for interrupts with INTR_TYPE_NET set.  Obviously, you
don't want to run with debug.mpsafenet set unless you're also running with
the network stack locking patches :-).

> - softclock: handles timeout.  CALLOUT_MPSAFE specifies that Giant
>   is not needed (or has been pushed down further) for individual
>   timeouts.
> - swi_net: calls netisrs.  NETISR_MPSAFE specifies that Giant is not
>   needed (or ...) for individual netisrs.
> - taskqueue_swi_run: calls queued MPSAFE tasks.  Non-MPSAFE tasks are
>   on another queue.

I've been working through some of the callouts in the system -- we have a
number of low-hanging fruit, such as some of the kernel log subsystem
pieces, that we might be able to handle pretty easily.  I have the NFS
server largely running without Giant (with the exception of entry into
VFS, where it has to grab Giant) and probably ought to merge those patches
sometime soon.

Robert N M Watson             FreeBSD Core Team, TrustedBSD Projects
robert@fledge.watson.org      Senior Research Scientist, McAfee Research



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.NEB.3.96L.1040503130429.95554B-100000>