Index: sys/amd64/amd64/uma_machdep.c =================================================================== --- sys/amd64/amd64/uma_machdep.c +++ sys/amd64/amd64/uma_machdep.c @@ -56,7 +56,7 @@ if (wait & M_NOWAIT) return (NULL); else - VM_WAIT; + VM_WAIT_FLAGS(wait); } else break; } Index: sys/cddl/compat/opensolaris/sys/kmem.h =================================================================== --- sys/cddl/compat/opensolaris/sys/kmem.h +++ sys/cddl/compat/opensolaris/sys/kmem.h @@ -44,7 +44,7 @@ #define POINTER_INVALIDATE(pp) (*(pp) = (void *)((uintptr_t)(*(pp)) | 0x1)) #define KM_SLEEP M_WAITOK -#define KM_PUSHPAGE M_WAITOK +#define KM_PUSHPAGE (M_WAITOK | M_USE_RESERVE) #define KM_NOSLEEP M_NOWAIT #define KM_NODEBUG M_NODUMP #define KM_NORMALPRI 0 Index: sys/vm/vm_kern.c =================================================================== --- sys/vm/vm_kern.c +++ sys/vm/vm_kern.c @@ -356,7 +356,7 @@ if (m == NULL) { VM_OBJECT_WUNLOCK(object); if ((flags & M_NOWAIT) == 0) { - VM_WAIT; + VM_WAIT_FLAGS(flags); VM_OBJECT_WLOCK(object); goto retry; } Index: sys/vm/vm_page.h =================================================================== --- sys/vm/vm_page.h +++ sys/vm/vm_page.h @@ -425,9 +425,6 @@ { int pflags; - KASSERT((malloc_flags & M_USE_RESERVE) == 0 || - (malloc_flags & M_NOWAIT) != 0, - ("M_USE_RESERVE requires M_NOWAIT")); pflags = (malloc_flags & M_USE_RESERVE) != 0 ? VM_ALLOC_INTERRUPT : VM_ALLOC_SYSTEM; if ((malloc_flags & M_ZERO) != 0) Index: sys/vm/vm_page.c =================================================================== --- sys/vm/vm_page.c +++ sys/vm/vm_page.c @@ -2501,8 +2501,16 @@ vm_wait(void) { + return (vm_wait_flags(0)); +} + +void +vm_wait_flags(int flags) +{ + + KASSERT((flags & M_WAITOK) == 0, ("vm_wait with M_WAITOK")); mtx_lock(&vm_page_queue_free_mtx); - if (curproc == pageproc) { + if (curproc == pageproc || (flags & M_USE_RESERVE) != 0) { vm_pageout_pages_needed = 1; msleep(&vm_pageout_pages_needed, &vm_page_queue_free_mtx, PDROP | PSWP, "VMWait", 0); Index: sys/vm/vm_pageout.h =================================================================== --- sys/vm/vm_pageout.h +++ sys/vm/vm_pageout.h @@ -102,8 +102,10 @@ extern void pagedaemon_wakeup(void); #define VM_WAIT vm_wait() +#define VM_WAIT_FLAGS(flags) vm_wait_flags(flags) #define VM_WAITPFAULT vm_waitpfault() extern void vm_wait(void); +extern void vm_wait_flags(int); extern void vm_waitpfault(void); #ifdef _KERNEL