From 79c2840d1d72c676ba79e9bfbddfeaffc0f9978f Mon Sep 17 00:00:00 2001 From: Pawel Jakub Dawidek Date: Thu, 10 Jan 2008 08:36:38 +0000 Subject: [PATCH] When one tries to allocate memory with the M_WAITOK flag and we are short in address space in kmem map call vm_lowmem event in a loop and wait a bit for subsystems to reclaim some memory which in turn will reclaim address space as well. Note, this is a work-around. Reviewed by: alc Approved by: alc MFC after: 3 days --- sys/vm/vm_kern.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/sys/vm/vm_kern.c b/sys/vm/vm_kern.c index 44694f51ea9..3de6b1d20b2 100644 --- a/sys/vm/vm_kern.c +++ b/sys/vm/vm_kern.c @@ -296,14 +296,21 @@ 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) { - EVENTHANDLER_INVOKE(vm_lowmem, 0); - uma_reclaim(); - vm_map_lock(map); - if (vm_map_findspace(map, vm_map_min(map), size, &addr)) { + if ((flags & M_NOWAIT) == 0) { + for (i = 0; i < 8; i++) { + EVENTHANDLER_INVOKE(vm_lowmem, 0); + uma_reclaim(); + vm_map_lock(map); + if (vm_map_findspace(map, vm_map_min(map), + size, &addr) == 0) { + break; + } vm_map_unlock(map); + tsleep(&i, 0, "nokva", (hz / 4) * (i + 1)); + } + if (i == 8) { panic("kmem_malloc(%ld): kmem_map too small: %ld total allocated", - (long)size, (long)map->size); + (long)size, (long)map->size); } } else { return (0);