Re: Ingo's realtime_preempt patch causes kernel oops

Sven-Thorsten Dietrich
2006-05-24T17:31:53Z

On Wed, 2006-05-24 at 18:43 +0200, Esben Nielsen wrote:
> On Wed, 24 May 2006, Steven Rostedt wrote:
>
> > On Wed, 2006-05-24 at 10:06 +0200, Yann.LEPROVOST@wavecom.fr wrote:
> > [...]
> >
> > Thomas or Ingo,
> >
> > Maybe the handling of IRQs needs to handle the case that shared irq can
> > have both a NODELAY and a thread. The irq descriptor could have a
> > NODELAY set if any of the actions are NODELAY, but before calling the
> > interrupt handler (in interrupt context), check if the action is NODELAY
> > or not, and if not, wake up the thread if not done so already.
> >
> > thoughts?
> >
>
> I am working on patchset dealing with this problem. It still needs clean
> up. The basic idea is to add a SA_MUSTTHREAD along with SA_NODELAY. Under
> PREEMPT_RT all interrupthandlers, which doesn't have SA_NODELAY, will get
> SA_MUSTTHREAD unless the driver is changed. In irq_request() it is checked
> if the handler has SA_NODELAY and an old has SA_MUSTTHREAD and visa
> versa.
>

Its easy for some drivers to be divided into lockless portions, which
can run as SA_NODELAY. If these are kept short (minimum prevent the
device from re-asserting the IRQ once it is unmasked), then it should be
able to share certain devices on PCI, for example.

In a sense, this is how the drivers should be designed,
but of course in practice its not always ideal...

> I have also made a lock type which can be changed from rt_mutex to
> raw_spin_lock runtime. And I have made a system with a call-back from the
> irq-layer to the driver so they can change their spinlocks on the fly when
> needed.
>

Sven