Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 16 Aug 2004 11:34:37 -0400
From:      Brian Fundakowski Feldman <green@FreeBSD.org>
To:        "M. Warner Losh" <imp@bsdimp.com>, jhb@FreeBSD.org
Cc:        current@FreeBSD.org
Subject:   Re: pccbb crashes when detaching (unsafe interrupt handler)
Message-ID:  <20040816153437.GJ980@green.homeunix.org>
In-Reply-To: <20040717.124803.33210527.imp@bsdimp.com>
References:  <20040717054014.GP1626@green.homeunix.org> <20040717.121712.83689795.imp@bsdimp.com> <20040717182841.GR1626@green.homeunix.org> <20040717.124803.33210527.imp@bsdimp.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Can we start off again on a good foot so we can fix this before
-STABLE?  I think, at a very very low cost (instruction cache
bloat, but few extra instructions in the fast-path), we can implement
suspension of ithread handlers.  This would completely solve the
problem at hand, and all the "slowness" would be pushed onto
the ithread munging calls.

I get an immediate panic when running X and unloading a card on my
notebook because they share interrupts. I get an immediate panic on
eject and kldunload, the exact same case, on my desktop when I'm playing
music and interrupts are shared between the cardbus and the sound card.
I don't think there would be harm pausing the interrupt handler to
create a critical section there.

That is, it_need would be cleared, ih_need would be cleared and
unsuspended interrupt handlers run, suspended interrupt handlers
acknowledged and then run once they become unsuspended. Where IH_DEAD is
checked would be added the test for suspension and acknowledgement.
We could use the mutex to synchronize the ithread suspension function by
setting a flag IH_WANTSUSPEND, use a flag IH_SUSPENDED to mark it
suspended, and only allow a single suspension at a time (the
ithread suspender would have to sleep until it can grab IH_WANTSUSPEND).
The cost would be nil (testing (IH_DEAD | IH_*SUSPEND*) instead of
IH_DEAD) plus one store and load (stack variable initialized to 0
for "need to run suspended handlers" after they have been iterated
through the first time).

Comments, please.

-- 
Brian Fundakowski Feldman                           \'[ FreeBSD ]''''''''''\
  <> green@FreeBSD.org                               \  The Power to Serve! \
 Opinions expressed are my own.                       \,,,,,,,,,,,,,,,,,,,,,,\



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