diff options
author | pjd <pjd@FreeBSD.org> | 2007-04-05 20:52:51 +0000 |
---|---|---|
committer | pjd <pjd@FreeBSD.org> | 2007-04-05 20:52:51 +0000 |
commit | a4513e9da8410de9807fcc5d2c2387629787ca6d (patch) | |
tree | c3e054e240942fb999b2df32e830bc58bb557cb1 /sys/vm/vm_kern.c | |
parent | b6f1c3fccc28d9f84c1ead17bacde21d07994485 (diff) | |
download | FreeBSD-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/vm_kern.c')
-rw-r--r-- | sys/vm/vm_kern.c | 18 |
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); |