diff options
author | wes <wes@FreeBSD.org> | 2003-03-31 21:09:57 +0000 |
---|---|---|
committer | wes <wes@FreeBSD.org> | 2003-03-31 21:09:57 +0000 |
commit | ca1839cb9191762cd4c49990a18f78fd9798c4d1 (patch) | |
tree | f83c7306439c7baa61bbd7bf0a72fa416688f426 /sys/vm | |
parent | 35e71f4a050af9100a931d737080b2818efa8c63 (diff) | |
download | FreeBSD-src-ca1839cb9191762cd4c49990a18f78fd9798c4d1.zip FreeBSD-src-ca1839cb9191762cd4c49990a18f78fd9798c4d1.tar.gz |
Add a facility allowing processes to inform the VM subsystem they are
critical and should not be killed when pageout is looking for more
memory pages in all the wrong places.
Reviewed by: arch@
Sponsored by: St. Bernard Software
Diffstat (limited to 'sys/vm')
-rw-r--r-- | sys/vm/vm_mmap.c | 15 | ||||
-rw-r--r-- | sys/vm/vm_pageout.c | 3 |
2 files changed, 17 insertions, 1 deletions
diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c index 93c8524..d20756f 100644 --- a/sys/vm/vm_mmap.c +++ b/sys/vm/vm_mmap.c @@ -752,8 +752,23 @@ madvise(td, uap) { vm_offset_t start, end; vm_map_t map; + struct proc *p; + int error; /* + * Check for our special case, advising the swap pager we are + * "immortal." + */ + if (uap->behav == MADV_PROTECT) { + p = td->td_proc; + PROC_LOCK(p); + error = suser(td); + if (error == 0) + p->p_flag |= P_PROTECTED; + PROC_UNLOCK(p); + return (error); + } + /* * Check for illegal behavior */ if (uap->behav < 0 || uap->behav > MADV_CORE) diff --git a/sys/vm/vm_pageout.c b/sys/vm/vm_pageout.c index dab4ae2..8c07be2 100644 --- a/sys/vm/vm_pageout.c +++ b/sys/vm/vm_pageout.c @@ -1184,9 +1184,10 @@ rescan0: if (PROC_TRYLOCK(p) == 0) continue; /* - * if this is a system process, skip it + * If this is a system or protected process, skip it. */ if ((p->p_flag & P_SYSTEM) || (p->p_pid == 1) || + (p->p_flag & P_PROTECTED) || ((p->p_pid < 48) && (vm_swap_size != 0))) { PROC_UNLOCK(p); continue; |