summaryrefslogtreecommitdiffstats
path: root/sys/vm
diff options
context:
space:
mode:
authorpjd <pjd@FreeBSD.org>2007-04-05 20:52:51 +0000
committerpjd <pjd@FreeBSD.org>2007-04-05 20:52:51 +0000
commita4513e9da8410de9807fcc5d2c2387629787ca6d (patch)
treec3e054e240942fb999b2df32e830bc58bb557cb1 /sys/vm
parentb6f1c3fccc28d9f84c1ead17bacde21d07994485 (diff)
downloadFreeBSD-src-a4513e9da8410de9807fcc5d2c2387629787ca6d.zip
FreeBSD-src-a4513e9da8410de9807fcc5d2c2387629787ca6d.tar.gz
When KVA is exhausted, try the vm_lowmem event for the last time before
panicing. This helps a lot in ZFS stability.
Diffstat (limited to 'sys/vm')
-rw-r--r--sys/vm/vm_kern.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/sys/vm/vm_kern.c b/sys/vm/vm_kern.c
index b6a4738..fd01c4e 100644
--- a/sys/vm/vm_kern.c
+++ b/sys/vm/vm_kern.c
@@ -68,6 +68,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h> /* for ticks and hz */
+#include <sys/eventhandler.h>
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/proc.h>
@@ -81,6 +82,7 @@ __FBSDID("$FreeBSD$");
#include <vm/vm_page.h>
#include <vm/vm_pageout.h>
#include <vm/vm_extern.h>
+#include <vm/uma.h>
vm_map_t kernel_map=0;
vm_map_t kmem_map=0;
@@ -294,10 +296,18 @@ kmem_malloc(map, size, flags)
vm_map_lock(map);
if (vm_map_findspace(map, vm_map_min(map), size, &addr)) {
vm_map_unlock(map);
- if ((flags & M_NOWAIT) == 0)
- panic("kmem_malloc(%ld): kmem_map too small: %ld total allocated",
- (long)size, (long)map->size);
- return (0);
+ if ((flags & M_NOWAIT) == 0) {
+ EVENTHANDLER_INVOKE(vm_lowmem, 0);
+ uma_reclaim();
+ vm_map_lock(map);
+ if (vm_map_findspace(map, vm_map_min(map), size, &addr)) {
+ vm_map_unlock(map);
+ panic("kmem_malloc(%ld): kmem_map too small: %ld total allocated",
+ (long)size, (long)map->size);
+ }
+ } else {
+ return (0);
+ }
}
offset = addr - VM_MIN_KERNEL_ADDRESS;
vm_object_reference(kmem_object);
OpenPOWER on IntegriCloud