HAMMER VFS - Ensure sufficient free memory is available before large allocation
authorMatthew Dillon <dillon@apollo.backplane.com>
Fri, 5 Mar 2010 00:06:53 +0000 (16:06 -0800)
committerMatthew Dillon <dillon@apollo.backplane.com>
Fri, 5 Mar 2010 00:06:53 +0000 (16:06 -0800)
* The HAMMER rebalancing code can be a heavy user of kernel memory when
  collecting B-Tree nodes to rebalance.

  Call the new vm_wait_nominal() function before allocating said memory
  in an attempt to avoid VM/VFS deadlocks when memory is low.

Reported-by: Francois Tigeot <ftigeot@wolfpond.org>
sys/vfs/hammer/hammer.h
sys/vfs/hammer/hammer_rebalance.c

index cc30895..1662b81 100644 (file)
@@ -58,6 +58,7 @@
 #include <sys/ktr.h>
 #include <sys/globaldata.h>
 #include <sys/limits.h>
+#include <vm/vm_extern.h>
 
 #include <sys/buf2.h>
 #include <sys/signal2.h>
index 6250eb5..1b8de5c 100644 (file)
@@ -112,6 +112,12 @@ retry:
        error = hammer_btree_first(&cursor);
 
        while (error == 0) {
+               /*
+                * Rebalancing can be hard on the memory allocator, make
+                * sure there is enough free memory before doing it.
+                */
+               vm_wait_nominal();
+
                /*
                 * We only care about internal nodes visited for the last
                 * time on the way up... that is, a trailing scan of the