Re: kernel: return from interrupt

From: John Baldwin (jhb_at_FreeBSD.org)
Date: 11/15/04

  • Next message: Jimmy Selgen: "Re: Reproducible panic in -CURRENT"
    To: freebsd-current@FreeBSD.org, Anurekh Saxena <anurekh@gmail.com>
    Date: Mon, 15 Nov 2004 14:33:57 -0500
    
    

    On Thursday 11 November 2004 10:59 pm, Anurekh Saxena wrote:
    > > > > Even normal "options PREEMPTION" should do this. I know from tracing
    > > > > the kernel in 6.x that that's the way the system behaves out of the
    > > > > box; with PREEMPTION turned on in 5.x you should see the same
    > > > > behavior. One thing I often do see, FWIW, is that if you're on an
    > > > > SMP box, the ithread will get scheduled to run immediately on another
    > > > > CPU that's idle, so you won't actually preempt the thread on the
    > > > > current CPU other than for the interrupt handler. What behavior are
    > > > > you seeing that suggests this isn't happening with PREEMPTION
    > > > > compiled in?
    > > >
    > > > I may be missing something fundamental here, but, doreti (exceptions.s)
    > > > does not call 'ast' for an interrupted task, that does not have RPL of
    > > > 3 (user). So, even if an interrupt is pending, and the 'NEEDRESCHED'
    > > > is set, the scheduling decision is delayed till the kernel thread or
    > > > whatever was running in the kernel sleeps, or give up the cpu(call
    > > > mi_switch), or returns to user mode.
    > > >
    > > > AFAIK this is the only return path from an interrupt. Unless there is
    > > > another return path for the interrupts, the scheduler is not invoked on
    > > > a return.
    > >
    > > Assuming we're talking about i386, lapic_handle_intr() will call
    > > intr_execute_handlers(), which will walk the list of handlers for the
    > > interrupt, and either directly invoke the fast handlers of the
    > > interrupts, or call ithread_schedule() to schedule the ithread.
    > > ithread_schedule() will invoke setrunqueue(), which enters the scheduler
    > > and is a preemption point. If you dig down a bit, you'll find a call to
    > > maybe_preempt(), which may preempt if appropriate, resulting in a call to
    > > mi_switch() to the ithread. The maybe_preempt() code will only kick in
    > > to actually switch if PREEMPTION is defined.
    >
    > Yeah, I got it wrong. Without the FULL_PREEMPTION enabled, it does not
    > preempt unless the current thread is in the idle priority band.
    > I was expecting the NEEDRESCHED flag to be used for preemption on
    > return paths, especially for interrupt context. I think this method
    > works better since preemption points become well defined in the
    > kernel.
    > Thanks for helping me figure this out.

    NEEDRESCHED (albeit rather broken at the moment) is used to implement
    preemptino of user threads. As Robert mentioned above, in-kernel preemption
    is managed via either direct switches in setrunqueue() or deferred
    preemptions via TDF_OWEPREEMPT in critical_exit().

    -- 
    John Baldwin <jhb@FreeBSD.org>  <><  http://www.FreeBSD.org/~jhb/
    "Power Users Use the Power to Serve"  =  http://www.FreeBSD.org
    _______________________________________________
    freebsd-current@freebsd.org mailing list
    http://lists.freebsd.org/mailman/listinfo/freebsd-current
    To unsubscribe, send any mail to "freebsd-current-unsubscribe@freebsd.org"
    

  • Next message: Jimmy Selgen: "Re: Reproducible panic in -CURRENT"

    Relevant Pages

    • Re: cooperative multitasking scheme
      ... >>The basic essence of preemption is that there must be some method by which the ... >software interrupt, thus the interrupt handler can be nearly identical ... That's cooperation. ... The software interrupt is nothing more than a call which is ...
      (comp.arch.embedded)
    • Re: What is the PREEMPTION option good for?
      ... I found another setup where PREEMPTION help -- nfs servers. ... give correct scheduling of interrupt threads, and that seems to be all ... FULL_PREEMPTION is apparently needed to get kernel threads preempted by ...
      (freebsd-arch)
    • Re: bge dropping packets issue
      ... But why was it added to begin with if standard interrupt driven I/O is ... than 150 usec), so 512 descriptors is more than enough for 1Gbps ethernet ... (the minimum possible inter-descriptor time for tiny packets is about 0.6 ... PREEMPTION so that lower-priority interrupt handlers like ata and sc get ...
      (freebsd-net)
    • [patch] Real-Time Preemption, -RT-2.6.10-rc1-mm3-V0.7.25-0
      ... i have released the -V0.7.25-0 Real-Time Preemption patch, ... new features and latency improvements. ... the biggest change is the threading of the lone remaining non-threaded ... external interrupt: the timer interrupt. ...
      (Linux-Kernel)
    • Re: What is the PREEMPTION option good for?
      ... suspiciously active on heavy loaded SMP web servers (even complained on ... I'll try disabling PREEMPTION and see how it goes. ... to RELENG_4 for interrupt latency. ... interrupt priorities don't work right -- ...
      (freebsd-arch)