cvs commit: src/sys/alpha/alpha interrupt.c src/sys/alpha/include
param.h src/sys/amd64/amd64 intr_machdep.c src/sys/amd64/include
param.h src/sys/conf NOTES options src/sys/i386/i386
intr_machdep.c src/sys/i386/include param.h src/sys/ia64/ia64 ...
jhb at FreeBSD.org
Fri Jul 2 13:49:12 PDT 2004
jhb 2004-07-02 20:21:44 UTC
FreeBSD src repository
sys/conf NOTES options
sys/kern kern_intr.c kern_mutex.c kern_shutdown.c
kern_switch.c kern_synch.c sched_4bsd.c
sys/sys interrupt.h proc.h
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
More information about the cvs-all