git: kernel - refactor cpusync and pmap_inval code, fix lockup
Matthew Dillon
dillon at crater.dragonflybsd.org
Mon Jan 10 15:26:49 PST 2011
commit d5b2d319bb8e5009b38780b6cacd8dae71b2f06d
Author: Matthew Dillon <dillon at apollo.backplane.com>
Date: Mon Jan 10 15:17:25 2011 -0800
kernel - refactor cpusync and pmap_inval code, fix lockup
* Simplify the cpusync API. The API now has only one initialization call,
one simplified rollup call, and two primary calls handling a single
function callback (instead of three callbacks).
cpusync_interlock() interlocks the specified set of cpus and ensures they
are running in a safe place, cpusync_deinterlock() executes the initialized
function on the cpu set and does not return until all cpus have completed
the operation.
* Simplify the pmap_inval per-platform API. pmap_inval_interlock() and
pmap_inval_deinterlock() now reflect similar functionality to the cpusync
API. pmap/pte operations are now synchronized when pmap_inval_deinterlock()
is called and not when pmap_inval_done() is called, reducing the range of
code which can execute while the cpu set is held quiescent.
pmap_inval_flush() has been removed. Critical section handling has also
been rearranged slightly in the pmap_inval* and cpusync* APIs.
* Fixes a cpusync lockup which occurs when the x86-64 pmap and pmap_inval
code is used to hold a cpu mask quiescent across complex subsystem calls.
Primarily accomplished by moving the synchronization out of
pmap_inval_flush() and into pmap_inval_deinterlock().
Summary of changes:
sys/kern/lwkt_ipiq.c | 264 ++++++++++++-------------------
sys/kern/lwkt_thread.c | 13 ++
sys/platform/pc32/i386/i686_mem.c | 12 +-
sys/platform/pc32/i386/pmap.c | 7 +-
sys/platform/pc32/i386/pmap_inval.c | 90 +++--------
sys/platform/pc32/i386/sys_machdep.c | 4 +-
sys/platform/pc32/include/pmap_inval.h | 2 +-
sys/platform/pc64/include/pmap_inval.h | 2 +-
sys/platform/pc64/x86_64/pmap.c | 7 +-
sys/platform/pc64/x86_64/pmap_inval.c | 96 ++++--------
sys/sys/thread.h | 21 +--
sys/sys/thread2.h | 13 ++
12 files changed, 199 insertions(+), 332 deletions(-)
http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff/d5b2d319bb8e5009b38780b6cacd8dae71b2f06d
--
DragonFly BSD source repository
More information about the Commits
mailing list