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
This commit is contained in:
silby 2002-02-19 18:34:02 +00:00
parent 318795b1e0
commit 1360e062fb
4 changed files with 28 additions and 4 deletions

View File

@ -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;
}
}

View File

@ -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:
*

View File

@ -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;

View File

@ -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));