aboutsummaryrefslogtreecommitdiff
path: root/sys/vm
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2010-05-04 05:14:43 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2010-05-04 05:14:43 +0000
commit88389d6103a728e508f8090b71c0bfef0bc66f8f (patch)
treecca823ecbeff638ae12bc0178fb6e5946d115e79 /sys/vm
parentc8ab44bfa8df18c96604a003772d1d47f5c8d087 (diff)
Notes
Diffstat (limited to 'sys/vm')
-rw-r--r--sys/vm/vm_fault.c21
-rw-r--r--sys/vm/vm_pageout.c4
2 files changed, 17 insertions, 8 deletions
diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c
index 68057fb4f3fd..a8ff435f443d 100644
--- a/sys/vm/vm_fault.c
+++ b/sys/vm/vm_fault.c
@@ -217,7 +217,7 @@ vm_fault(vm_map_t map, vm_offset_t vaddr, vm_prot_t fault_type,
vm_object_t next_object;
vm_page_t marray[VM_FAULT_READ];
int hardfault;
- int faultcount, ahead, behind;
+ int faultcount, ahead, behind, alloc_req;
struct faultstate fs;
struct vnode *vp;
int locked, error;
@@ -414,9 +414,14 @@ RetryFault:;
/*
* Allocate a new page for this object/offset pair.
+ *
+ * Unlocked read of the p_flag is harmless. At
+ * worst, the P_KILLED might be not observed
+ * there, and allocation can fail, causing
+ * restart and new reading of the p_flag.
*/
fs.m = NULL;
- if (!vm_page_count_severe()) {
+ if (!vm_page_count_severe() || P_KILLED(curproc)) {
#if VM_NRESERVLEVEL > 0
if ((fs.object->flags & OBJ_COLORED) == 0) {
fs.object->flags |= OBJ_COLORED;
@@ -424,10 +429,13 @@ RetryFault:;
fs.pindex;
}
#endif
+ alloc_req = P_KILLED(curproc) ?
+ VM_ALLOC_SYSTEM : VM_ALLOC_NORMAL;
+ if (fs.object->type != OBJT_VNODE &&
+ fs.object->backing_object == NULL)
+ alloc_req |= VM_ALLOC_ZERO;
fs.m = vm_page_alloc(fs.object, fs.pindex,
- (fs.object->type == OBJT_VNODE ||
- fs.object->backing_object != NULL) ?
- VM_ALLOC_NORMAL : VM_ALLOC_ZERO);
+ alloc_req);
}
if (fs.m == NULL) {
unlock_and_deallocate(&fs);
@@ -452,7 +460,8 @@ readrest:
int reqpage = 0;
u_char behavior = vm_map_entry_behavior(fs.entry);
- if (behavior == MAP_ENTRY_BEHAV_RANDOM) {
+ if (behavior == MAP_ENTRY_BEHAV_RANDOM ||
+ P_KILLED(curproc)) {
ahead = 0;
behind = 0;
} else {
diff --git a/sys/vm/vm_pageout.c b/sys/vm/vm_pageout.c
index 723b14d2175a..dc2b3b77d569 100644
--- a/sys/vm/vm_pageout.c
+++ b/sys/vm/vm_pageout.c
@@ -1206,10 +1206,10 @@ vm_pageout_oom(int shortage)
if (PROC_TRYLOCK(p) == 0)
continue;
/*
- * If this is a system or protected process, skip it.
+ * If this is a system, protected or killed process, skip it.
*/
if ((p->p_flag & (P_INEXEC | P_PROTECTED | P_SYSTEM)) ||
- (p->p_pid == 1) ||
+ (p->p_pid == 1) || P_KILLED(p) ||
((p->p_pid < 48) && (swap_pager_avail != 0))) {
PROC_UNLOCK(p);
continue;