summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_map.c
diff options
context:
space:
mode:
authordillon <dillon@FreeBSD.org>2001-06-09 18:06:58 +0000
committerdillon <dillon@FreeBSD.org>2001-06-09 18:06:58 +0000
commit3d6ba4564bf239ad99f50088d7cad2ad6bc90092 (patch)
treed94b91b47c5666d6800efb64de3961ab8db12c56 /sys/vm/vm_map.c
parentb87b49d4db0c558a662d2405d6c74481bc36b2e9 (diff)
downloadFreeBSD-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.c35
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
OpenPOWER on IntegriCloud