Index: uma_core.c =================================================================== RCS file: /home/ncvs/src/sys/vm/uma_core.c,v retrieving revision 1.119.2.16 diff -u -r1.119.2.16 uma_core.c --- uma_core.c 2 Jun 2006 09:56:27 -0000 1.119.2.16 +++ uma_core.c 10 Dec 2006 21:09:01 -0000 @@ -2016,9 +2016,12 @@ if (flags & M_NOWAIT) break; - else + else { + vm_uma_drain_needed = 1; msleep(keg, &keg->uk_lock, PVM, "zonelimit", 0); + vm_uma_drain_needed = 0; + } continue; } keg->uk_recurse++; Index: uma_int.h =================================================================== RCS file: /home/ncvs/src/sys/vm/uma_int.h,v retrieving revision 1.31.2.6 diff -u -r1.31.2.6 uma_int.h --- uma_int.h 15 Aug 2005 09:01:11 -0000 1.31.2.6 +++ uma_int.h 10 Dec 2006 21:10:46 -0000 @@ -324,6 +324,9 @@ #define UMA_ZFLAG_CACHEONLY 0x80000000 /* Don't ask VM for buckets. */ #ifdef _KERNEL +/* XXX Whether we want to drain UMA zones */ +extern int vm_uma_drain_needed; + /* Internal prototypes */ static __inline uma_slab_t hash_sfind(struct uma_hash *hash, u_int8_t *data); void *uma_large_malloc(int size, int wait); Index: vm_pageout.c =================================================================== RCS file: /home/ncvs/src/sys/vm/vm_pageout.c,v retrieving revision 1.268.2.3 diff -u -r1.268.2.3 vm_pageout.c --- vm_pageout.c 9 Mar 2006 00:02:51 -0000 1.268.2.3 +++ vm_pageout.c 10 Dec 2006 21:15:13 -0000 @@ -140,6 +140,7 @@ int vm_pages_needed; /* Event on which pageout daemon sleeps */ +int vm_uma_drain_needed = 0; /* Are we low on UMA zones? */ int vm_pageout_deficit; /* Estimated number of pages deficit */ int vm_pageout_pages_needed; /* flag saying that the pageout daemon needs pages */ @@ -694,7 +695,27 @@ vm_page_unlock_queues(); pmap_pagedaemon_waken = 0; } - + +/* + * vm_uma_drain drains UMA zones when necessary. + * + * Must be called with Giant held. + */ +static void +vm_uma_drain(void) +{ + + mtx_assert(&Giant, MA_OWNED); + /* + * Decrease registered cache sizes. + */ + EVENTHANDLER_INVOKE(vm_lowmem, 0); + /* + * We do this explicitly after the caches have been drained above. + */ + uma_reclaim(); +} + /* * vm_pageout_scan does the dirty work for the pageout daemon. */ @@ -715,14 +736,7 @@ int maxlaunder; mtx_lock(&Giant); - /* - * Decrease registered cache sizes. - */ - EVENTHANDLER_INVOKE(vm_lowmem, 0); - /* - * We do this explicitly after the caches have been drained above. - */ - uma_reclaim(); + vm_uma_drain(); /* * Do whatever cleanup that the pmap code can. */ @@ -1508,6 +1522,14 @@ * The pageout daemon is never done, so loop forever. */ while (TRUE) { + /* + * If we got trouble for UMA, drain it. + */ + if (vm_uma_drain_needed) { + mtx_lock(&Giant); + vm_uma_drain(); + mtx_unlock(&Giant); + } vm_page_lock_queues(); /* * If we have enough free memory, wakeup waiters. Do