From ef6020d18714af9f7540fd367ac87f7a831ecf99 Mon Sep 17 00:00:00 2001 From: Mike Silbersack Date: Tue, 19 Feb 2002 18:34:02 +0000 Subject: [PATCH] Changes to make the OOM killer much more effective: - Allow the OOM killer to target processes currently locked in memory. These very often are the ones doing the memory hogging. - Drop the wakeup priority of processes currently sleeping while waiting for their page fault to complete. In order for the OOM killer to work well, the killed process and other system processes waiting on memory must be allowed to wakeup first. Reviewed by: dillon MFC after: 1 week --- sys/vm/vm_fault.c | 4 ++-- sys/vm/vm_page.c | 23 +++++++++++++++++++++++ sys/vm/vm_pageout.c | 3 +-- sys/vm/vm_pageout.h | 2 ++ 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c index 79e122420ad..77e161514c2 100644 --- a/sys/vm/vm_fault.c +++ b/sys/vm/vm_fault.c @@ -347,7 +347,7 @@ RetryFault:; if ((queue - fs.m->pc) == PQ_CACHE && vm_page_count_severe()) { vm_page_activate(fs.m); unlock_and_deallocate(&fs); - VM_WAIT; + VM_WAITPFAULT; goto RetryFault; } @@ -388,7 +388,7 @@ RetryFault:; } if (fs.m == NULL) { unlock_and_deallocate(&fs); - VM_WAIT; + VM_WAITPFAULT; goto RetryFault; } } diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c index abc41945584..2c0052b9c86 100644 --- a/sys/vm/vm_page.c +++ b/sys/vm/vm_page.c @@ -967,6 +967,7 @@ vm_page_alloc(vm_object_t object, vm_pindex_t pindex, int page_req) * vm_wait: (also see VM_WAIT macro) * * Block until free pages are available for allocation + * - Called in various places before memory allocations. */ void @@ -988,6 +989,28 @@ vm_wait(void) splx(s); } +/* + * vm_waitpfault: (also see VM_WAITPFAULT macro) + * + * Block until free pages are available for allocation + * - Called only in vm_fault so that processes page faulting + * can be easily tracked. + */ + +void +vm_waitpfault(void) +{ + int s; + + s = splvm(); + if (!vm_pages_needed) { + vm_pages_needed = 1; + wakeup(&vm_pages_needed); + } + tsleep(&cnt.v_free_count, PUSER, "pfault", 0); + splx(s); +} + /* * vm_page_activate: * diff --git a/sys/vm/vm_pageout.c b/sys/vm/vm_pageout.c index 57f22b2a8ba..657f5e71a75 100644 --- a/sys/vm/vm_pageout.c +++ b/sys/vm/vm_pageout.c @@ -1141,8 +1141,7 @@ vm_pageout_scan(int pass) /* * if this is a system process, skip it */ - if ((p->p_flag & P_SYSTEM) || (p->p_lock > 0) || - (p->p_pid == 1) || + if ((p->p_flag & P_SYSTEM) || (p->p_pid == 1) || ((p->p_pid < 48) && (vm_swap_size != 0))) { PROC_UNLOCK(p); continue; diff --git a/sys/vm/vm_pageout.h b/sys/vm/vm_pageout.h index bfcfbb110a3..fc88589d597 100644 --- a/sys/vm/vm_pageout.h +++ b/sys/vm/vm_pageout.h @@ -100,7 +100,9 @@ extern int vm_pageout_deficit; extern void pagedaemon_wakeup __P((void)); #define VM_WAIT vm_wait() +#define VM_WAITPFAULT vm_waitpfault() extern void vm_wait __P((void)); +extern void vm_waitpfault __P((void)); #ifdef _KERNEL void vm_pageout_page __P((vm_page_t, vm_object_t)); -- 2.45.2