git: kernel - More many-cores SMP work
Matthew Dillon
dillon at crater.dragonflybsd.org
Fri Oct 28 00:07:03 PDT 2011
commit d2d8515bfb3ec54e781aeef674516e513bfbb8cb
Author: Matthew Dillon <dillon at apollo.backplane.com>
Date: Thu Oct 27 23:50:51 2011 -0700
kernel - More many-cores SMP work
* Add lwkt_yield() calls in a few critical places which can hog the cpu
on large many-cores boxes during periods of very heavy contention. This
allows other kernel threads on the same cpu to run and reduces symptoms
of e.g. high ping times under certain load conditions.
* Run the callout kernel threads at the same priority as other kernel
threads so cpu-hogging operations run from callouts can yield to
other kernel threads (e.g. yield to the netisr threads).
* Change the vm_page_alloc() API to catch situations where the allocation
races an insertion due to potentially blocking when dealing with
PQ_CACHE pages. VM_ALLOC_NULL_OK allows vm_page_alloc() to return NULL
in this case (otherwise it will panic).
* Change vm_page_insert() to return TRUE if the insertion succeeded and
FALSE if it didn't due to a race against another thread.
* Change the meaning of the cpuid argument to lwkt_alloc_thread() and
lwkt_create(). A cpuid of -1 will cause the kernel to choose a cpu
to run the thread on (instead of choosing the current cpu).
Eventually this specification will allow dynamic migration (but not at
the moment).
Adjust lwp_fork() to specify the current cpu, required for initial
LWKT calls when setting the forked thread up.
Numerous kernel threads will now be spread around available cpus for
now. devfs core threads, NFS socket threads, etc.
Interrupt threads are still fixed on cpu 0 awaiting additional work from
Sephe.
Put the emergency interrupt thread on the last cpu.
* Change the vm_page_grab() API. When VM_ALLOC_ZERO is specified the
vm_page_grab() code will automatically set an invalid page valid and
zero it (using the PG_ZERO optimization if possible). Pages which are
already valid are not zero'd.
This simplies several use cases.
* Change vm_fault_page() to enter the page into the pmap while the vm_map
is still locked, instead of after unlocking it. For now anyhow.
* Minor change to ensure that a deterministic value is stored in *freebuf
in vn_fullpath().
* Minor debugging features added to help track down a x86-64 sge-fault
issue.
Summary of changes:
sys/dev/agp/agp.c | 15 ++--
sys/dev/agp/agp_i810.c | 7 +-
sys/kern/kern_fork.c | 11 ++-
sys/kern/kern_intr.c | 6 +-
sys/kern/kern_kthread.c | 2 +
sys/kern/kern_synch.c | 3 +
sys/kern/kern_timeout.c | 6 ++-
sys/kern/lwkt_thread.c | 28 +++++---
sys/kern/subr_disk.c | 2 +-
sys/kern/uipc_syscalls.c | 3 +-
sys/kern/vfs_cache.c | 1 +
sys/platform/pc32/i386/pmap.c | 38 ++---------
sys/platform/pc64/x86_64/trap.c | 34 +++++++++-
sys/platform/vkernel/platform/pmap.c | 15 +----
sys/platform/vkernel64/platform/pmap.c | 23 ++-----
sys/sys/kthread.h | 2 -
sys/vfs/devfs/devfs_core.c | 2 +-
sys/vfs/nfs/nfs_vfsops.c | 4 +-
sys/vm/device_pager.c | 5 +-
sys/vm/swap_pager.c | 9 +++
sys/vm/vm_contig.c | 6 ++-
sys/vm/vm_fault.c | 61 ++++++++++++-----
sys/vm/vm_kern.c | 7 +--
sys/vm/vm_map.c | 5 +-
sys/vm/vm_object.c | 14 ++--
sys/vm/vm_page.c | 115 +++++++++++++++++++++----------
sys/vm/vm_page.h | 15 +++--
sys/vm/vm_pageout.c | 5 ++
sys/vm/vm_swapcache.c | 2 +-
29 files changed, 263 insertions(+), 183 deletions(-)
http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff/d2d8515bfb3ec54e781aeef674516e513bfbb8cb
--
DragonFly BSD source repository
More information about the Commits
mailing list