HEADSUP: Native preemption added to the kernel scheduler
John Baldwin
jhb at FreeBSD.org
Fri Jul 2 14:29:16 PDT 2004
In theory this is a big NOP except for some small optimizations in the form of
avoiding a few context switches and avoiding some run queue operations.
Several people have tested this code but there may be some remaining
adventures. Note that this adds a printf during dmesg for architectures that
do not support preemption about preemption being disabled and degrading
performance (mostly via increased latency). Preemption is enabled by
defining PREEMPTION in <machine/param.h> and architecture porters are
encouraged to get preemption working on their architecture.
On Friday 02 July 2004 04:21 pm, John Baldwin wrote:
> jhb 2004-07-02 20:21:44 UTC
>
> FreeBSD src repository
>
> Modified files:
> sys/alpha/alpha interrupt.c
> sys/alpha/include param.h
> sys/amd64/amd64 intr_machdep.c
> sys/amd64/include param.h
> sys/conf NOTES options
> sys/i386/i386 intr_machdep.c
> sys/i386/include param.h
> sys/ia64/ia64 interrupt.c
> sys/kern kern_intr.c kern_mutex.c kern_shutdown.c
> kern_switch.c kern_synch.c sched_4bsd.c
> sched_ule.c
> sys/powerpc/powerpc intr_machdep.c
> sys/sparc64/sparc64 intr_machdep.c
> sys/sys interrupt.h proc.h
> sys/vm vm_zeroidle.c
> Log:
> Implement preemption of kernel threads natively in the scheduler rather
> than as one-off hacks in various other parts of the kernel:
> - Add a function maybe_preempt() that is called from sched_add() to
> determine if a thread about to be added to a run queue should be
> preempted to directly. If it is not safe to preempt or if the new
> thread does not have a high enough priority, then the function returns
> false and sched_add() adds the thread to the run queue. If the thread
> should be preempted to but the current thread is in a nested critical
> section, then the flag TDF_OWEPREEMPT is set and the thread is added
> to the run queue. Otherwise, mi_switch() is called immediately and the
> thread is never added to the run queue since it is switch to directly.
> When exiting an outermost critical section, if TDF_OWEPREEMPT is set,
> then clear it and call mi_switch() to perform the deferred preemption.
> - Remove explicit preemption from ithread_schedule() as calling
> setrunqueue() now does all the correct work. This also removes the
> do_switch argument from ithread_schedule().
> - Do not use the manual preemption code in mtx_unlock if the architecture
> supports native preemption.
> - Don't call mi_switch() in a loop during shutdown to give ithreads a
> chance to run if the architecture supports native preemption since
> the ithreads will just preempt DELAY().
> - Don't call mi_switch() from the page zeroing idle thread for
> architectures that support native preemption as it is unnecessary.
> - Native preemption is enabled on the same archs that supported ithread
> preemption, namely alpha, i386, and amd64.
>
> This change should largely be a NOP for the default case as committed
> except that we will do fewer context switches in a few cases and will
> avoid the run queues completely when preempting.
>
> Approved by: scottl (with his re@ hat)
>
> Revision Changes Path
> 1.79 +1 -1 src/sys/alpha/alpha/interrupt.c
> 1.34 +2 -0 src/sys/alpha/include/param.h
> 1.7 +1 -1 src/sys/amd64/amd64/intr_machdep.c
> 1.12 +2 -0 src/sys/amd64/include/param.h
> 1.1240 +6 -0 src/sys/conf/NOTES
> 1.459 +1 -0 src/sys/conf/options
> 1.7 +1 -1 src/sys/i386/i386/intr_machdep.c
> 1.71 +2 -0 src/sys/i386/include/param.h
> 1.46 +1 -1 src/sys/ia64/ia64/interrupt.c
> 1.111 +3 -16 src/sys/kern/kern_intr.c
> 1.140 +6 -0 src/sys/kern/kern_mutex.c
> 1.153 +24 -13 src/sys/kern/kern_shutdown.c
> 1.68 +93 -4 src/sys/kern/kern_switch.c
> 1.252 +4 -1 src/sys/kern/kern_synch.c
> 1.43 +11 -1 src/sys/kern/sched_4bsd.c
> 1.110 +10 -1 src/sys/kern/sched_ule.c
> 1.6 +1 -1 src/sys/powerpc/powerpc/intr_machdep.c
> 1.19 +0 -4 src/sys/sparc64/sparc64/intr_machdep.c
> 1.28 +1 -1 src/sys/sys/interrupt.h
> 1.384 +2 -0 src/sys/sys/proc.h
> 1.26 +2 -0 src/sys/vm/vm_zeroidle.c
--
John Baldwin <jhb at FreeBSD.org> <>< http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve" = http://www.FreeBSD.org
More information about the cvs-all
mailing list