diff options
author | dillon <dillon@FreeBSD.org> | 2001-06-09 18:06:58 +0000 |
---|---|---|
committer | dillon <dillon@FreeBSD.org> | 2001-06-09 18:06:58 +0000 |
commit | 3d6ba4564bf239ad99f50088d7cad2ad6bc90092 (patch) | |
tree | d94b91b47c5666d6800efb64de3961ab8db12c56 /sys/vm/vm_map.c | |
parent | b87b49d4db0c558a662d2405d6c74481bc36b2e9 (diff) | |
download | FreeBSD-src-3d6ba4564bf239ad99f50088d7cad2ad6bc90092.zip FreeBSD-src-3d6ba4564bf239ad99f50088d7cad2ad6bc90092.tar.gz |
Two fixes to the out-of-swap process termination code. First, start killing
processes a little earlier to avoid a deadlock. Second, when calculating
the 'largest process' do not just count RSS. Instead count the RSS + SWAP
used by the process. Without this the code tended to kill small
inconsequential processes like, oh, sshd, rather then one of the many
'eatmem 200MB' I run on a whim :-). This fix has been extensively tested on
-stable and somewhat tested on -current and will be MFCd in a few days.
Shamed into fixing this by: ps
Diffstat (limited to 'sys/vm/vm_map.c')
-rw-r--r-- | sys/vm/vm_map.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c index 428c194..d040819 100644 --- a/sys/vm/vm_map.c +++ b/sys/vm/vm_map.c @@ -226,6 +226,41 @@ vmspace_free(vm) } /* + * vmspace_swap_count() - count the approximate swap useage in pages for a + * vmspace. + * + * Swap useage is determined by taking the proportional swap used by + * VM objects backing the VM map. To make up for fractional losses, + * if the VM object has any swap use at all the associated map entries + * count for at least 1 swap page. + */ +int +vmspace_swap_count(struct vmspace *vmspace) +{ + vm_map_t map = &vmspace->vm_map; + vm_map_entry_t cur; + int count = 0; + + for (cur = map->header.next; cur != &map->header; cur = cur->next) { + vm_object_t object; + + if ((cur->eflags & MAP_ENTRY_IS_SUB_MAP) == 0 && + (object = cur->object.vm_object) != NULL && + object->type == OBJT_SWAP + ) { + int n = (cur->end - cur->start) / PAGE_SIZE; + + if (object->un_pager.swp.swp_bcount) { + count += object->un_pager.swp.swp_bcount * SWAP_META_PAGES * n / + object->size + 1; + } + } + } + return(count); +} + + +/* * vm_map_create: * * Creates and returns a new empty VM map with |