Index: vm/memguard.c =================================================================== RCS file: /zoo/pjd/repo/src/sys/vm/memguard.c,v retrieving revision 1.6 diff -u -p -r1.6 memguard.c --- vm/memguard.c 30 Dec 2005 11:45:07 -0000 1.6 +++ vm/memguard.c 6 Nov 2007 22:49:08 -0000 @@ -291,7 +291,7 @@ memguard_free(void *addr) MEMGUARD_CRIT_SECTION_EXIT; memguard_unguard(addr, idx + 1); /* just in case */ vclrmgfifo((vm_offset_t)addr); - kmem_free(memguard_map, (vm_offset_t)addr, + kmem_free_wakeup(memguard_map, (vm_offset_t)addr, PAGE_SIZE * (idx + 1)); return; } Index: vm/uma_core.c =================================================================== RCS file: /zoo/pjd/repo/src/sys/vm/uma_core.c,v retrieving revision 1.148 diff -u -p -r1.148 uma_core.c --- vm/uma_core.c 11 Oct 2007 20:11:27 -0000 1.148 +++ vm/uma_core.c 6 Nov 2007 22:49:22 -0000 @@ -1039,7 +1039,7 @@ page_free(void *mem, int size, u_int8_t else panic("UMA: page_free used with invalid flags %d\n", flags); - kmem_free(map, (vm_offset_t)mem, size); + kmem_free_wakeup(map, (vm_offset_t)mem, size); } /* Index: vm/vm_kern.c =================================================================== RCS file: /zoo/pjd/repo/src/sys/vm/vm_kern.c,v retrieving revision 1.128 diff -u -p -r1.128 vm_kern.c --- vm/vm_kern.c 5 Apr 2007 20:52:51 -0000 1.128 +++ vm/vm_kern.c 7 Nov 2007 16:08:13 -0000 @@ -286,33 +286,35 @@ kmem_malloc(map, size, flags) int pflags; size = round_page(size); - addr = vm_map_min(map); /* * Locate sufficient space in the map. This will give us the final * virtual address for the new memory, and thus will tell us the * offset within the kernel map. */ - 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)) { - vm_map_unlock(map); + i = 0; + for (;;) { + vm_map_lock(map); + if (vm_map_findspace(map, vm_map_min(map), size, &addr) == 0) + break; + if ((flags & M_NOWAIT) != 0) { + vm_map_unlock(map); + return (0); + } + map->needs_wakeup = TRUE; + if (vm_map_unlock_and_wait(map, hz / 2) == EWOULDBLOCK) { + if (++i == 16) { panic("kmem_malloc(%ld): kmem_map too small: %ld total allocated", - (long)size, (long)map->size); + (long)size, (long)map->size); } - } else { - return (0); + EVENTHANDLER_INVOKE(vm_lowmem, 0); + uma_reclaim(); } } offset = addr - VM_MIN_KERNEL_ADDRESS; vm_object_reference(kmem_object); vm_map_insert(map, kmem_object, offset, addr, addr + size, - VM_PROT_ALL, VM_PROT_ALL, 0); + VM_PROT_ALL, VM_PROT_ALL, 0); /* * Note: if M_NOWAIT specified alone, allocate from @@ -446,7 +448,7 @@ kmem_alloc_wait(map, size) return (0); } map->needs_wakeup = TRUE; - vm_map_unlock_and_wait(map, FALSE); + vm_map_unlock_and_wait(map, 0); } vm_map_insert(map, NULL, 0, addr, addr + size, VM_PROT_ALL, VM_PROT_ALL, 0); vm_map_unlock(map); Index: vm/vm_map.c =================================================================== RCS file: /zoo/pjd/repo/src/sys/vm/vm_map.c,v retrieving revision 1.390 diff -u -p -r1.390 vm_map.c --- vm/vm_map.c 5 Nov 2007 11:36:16 -0000 1.390 +++ vm/vm_map.c 6 Nov 2007 22:46:00 -0000 @@ -536,12 +536,12 @@ _vm_map_lock_downgrade(vm_map_t map, con * vm_map_unlock_and_wait: */ int -vm_map_unlock_and_wait(vm_map_t map, boolean_t user_wait) +vm_map_unlock_and_wait(vm_map_t map, int timo) { mtx_lock(&map_sleep_mtx); vm_map_unlock(map); - return (msleep(&map->root, &map_sleep_mtx, PDROP | PVM, "vmmaps", 0)); + return (msleep(&map->root, &map_sleep_mtx, PDROP | PVM, "vmmaps", timo)); } /* @@ -1859,7 +1859,7 @@ vm_map_unwire(vm_map_t map, vm_offset_t saved_start = (start >= entry->start) ? start : entry->start; entry->eflags |= MAP_ENTRY_NEEDS_WAKEUP; - if (vm_map_unlock_and_wait(map, user_unwire)) { + if (vm_map_unlock_and_wait(map, 0)) { /* * Allow interruption of user unwiring? */ @@ -2005,7 +2005,7 @@ vm_map_wire(vm_map_t map, vm_offset_t st saved_start = (start >= entry->start) ? start : entry->start; entry->eflags |= MAP_ENTRY_NEEDS_WAKEUP; - if (vm_map_unlock_and_wait(map, user_wire)) { + if (vm_map_unlock_and_wait(map, 0)) { /* * Allow interruption of user wiring? */ @@ -2361,7 +2361,7 @@ vm_map_delete(vm_map_t map, vm_offset_t saved_start = entry->start; entry->eflags |= MAP_ENTRY_NEEDS_WAKEUP; last_timestamp = map->timestamp; - (void) vm_map_unlock_and_wait(map, FALSE); + (void) vm_map_unlock_and_wait(map, 0); vm_map_lock(map); if (last_timestamp + 1 != map->timestamp) { /* Index: vm/vm_map.h =================================================================== RCS file: /zoo/pjd/repo/src/sys/vm/vm_map.h,v retrieving revision 1.120 diff -u -p -r1.120 vm_map.h --- vm/vm_map.h 20 Aug 2007 12:05:45 -0000 1.120 +++ vm/vm_map.h 6 Nov 2007 22:43:17 -0000 @@ -272,7 +272,7 @@ int _vm_map_trylock(vm_map_t map, const int _vm_map_trylock_read(vm_map_t map, const char *file, int line); int _vm_map_lock_upgrade(vm_map_t map, const char *file, int line); void _vm_map_lock_downgrade(vm_map_t map, const char *file, int line); -int vm_map_unlock_and_wait(vm_map_t map, boolean_t user_wait); +int vm_map_unlock_and_wait(vm_map_t map, int timo); void vm_map_wakeup(vm_map_t map); #define vm_map_lock(map) _vm_map_lock(map, LOCK_FILE, LOCK_LINE)