aboutsummaryrefslogtreecommitdiff
path: root/kern/thread.h
diff options
context:
space:
mode:
authorRichard Braun <rbraun@sceen.net>2016-09-16 04:39:02 +0200
committerRichard Braun <rbraun@sceen.net>2016-09-16 04:55:48 +0200
commitc78fe96446794f71a2db7d7e3d43cb15658590a3 (patch)
treebaa0dbed20f9425eca108e4062f28a82a760944c /kern/thread.h
parentce50aa8ba8549d2cabfe9cfc9d324bd08d7430d6 (diff)
downloadgnumach-c78fe96446794f71a2db7d7e3d43cb15658590a3.tar.gz
gnumach-c78fe96446794f71a2db7d7e3d43cb15658590a3.tar.bz2
gnumach-c78fe96446794f71a2db7d7e3d43cb15658590a3.zip
VM: improve pageout deadlock workaround
Commit 5dd4f67522ad0d49a2cecdb9b109251f546d4dd1 makes VM map entry allocation done with VM privilege, so that a VM map isn't held locked while physical allocations are paused, which may block the default pager during page eviction, causing a system-wide deadlock. First, it turns out that map entries aren't the only buffers allocated, and second, their number can't be easily determined, which makes a preallocation strategy very hard to implement. This change generalizes the strategy of VM privilege increase when a VM map is locked. * device/ds_routines.c (io_done_thread): Use integer values instead of booleans when setting VM privilege. * kern/thread.c (thread_init, thread_wire): Likewise. * vm/vm_pageout.c (vm_pageout): Likewise. * kern/thread.h (struct thread): Turn member `vm_privilege' into an unsigned integer. * vm/vm_map.c (vm_map_lock): New function, where VM privilege is temporarily increased. (vm_map_unlock): New function, where VM privilege is decreased. (_vm_map_entry_create): Remove VM privilege workaround from this function. * vm/vm_map.h (vm_map_lock, vm_map_unlock): Turn into functions.
Diffstat (limited to 'kern/thread.h')
-rw-r--r--kern/thread.h5
1 files changed, 2 insertions, 3 deletions
diff --git a/kern/thread.h b/kern/thread.h
index 7106fd2d..f0ed71a8 100644
--- a/kern/thread.h
+++ b/kern/thread.h
@@ -77,7 +77,6 @@ struct thread {
struct {
unsigned state:16;
unsigned wake_active:1;
- unsigned vm_privilege:1;
unsigned active:1;
};
event_t event_key;
@@ -146,8 +145,8 @@ struct thread {
/* VM global variables */
vm_offset_t recover; /* page fault recovery (copyin/out) */
- /* Defined above */
- /* boolean_t vm_privilege; Can use reserved memory? */
+ unsigned int vm_privilege; /* Can use reserved memory?
+ Implemented as a counter */
/* User-visible scheduling state */
int user_stop_count; /* outstanding stops */