]> granicus.if.org Git - spl/commitdiff
Add KMC_NOEMERGENCY slab flag
authorBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 7 Sep 2012 21:24:17 +0000 (14:24 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 7 Sep 2012 21:27:03 +0000 (14:27 -0700)
Provide a flag to disable the use of emergency objects for a
specific kmem cache.  There may be instances where under no
circumstances should you kmalloc() an emergency object.  For
example, when you cache contains very large objects (>128k).

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
include/sys/kmem.h
module/spl/spl-kmem.c

index 116d6db0df222ea28543afb897565592f8dda398..0149e754c33c7ac7031e4f29afb8fd4fba4b550a 100644 (file)
@@ -340,6 +340,7 @@ enum {
        KMC_BIT_KMEM            = 5,    /* Use kmem cache */
        KMC_BIT_VMEM            = 6,    /* Use vmem cache */
        KMC_BIT_OFFSLAB         = 7,    /* Objects not on slab */
+       KMC_BIT_NOEMERGENCY     = 8,    /* Disable emergency objects */
        KMC_BIT_GROWING         = 15,   /* Growing in progress */
        KMC_BIT_REAPING         = 16,   /* Reaping in progress */
        KMC_BIT_DESTROY         = 17,   /* Destroy in progress */
@@ -365,6 +366,7 @@ typedef enum kmem_cbrc {
 #define KMC_KMEM               (1 << KMC_BIT_KMEM)
 #define KMC_VMEM               (1 << KMC_BIT_VMEM)
 #define KMC_OFFSLAB            (1 << KMC_BIT_OFFSLAB)
+#define KMC_NOEMERGENCY                (1 << KMC_BIT_NOEMERGENCY)
 #define KMC_GROWING            (1 << KMC_BIT_GROWING)
 #define KMC_REAPING            (1 << KMC_BIT_REAPING)
 #define KMC_DESTROY            (1 << KMC_BIT_DESTROY)
index e07e08c911086d1dfc3ff9032d7bc90556c9d8ed..eca809c4776a192dbbfc64bb8d1e1e8fa8851e2d 100644 (file)
@@ -1727,8 +1727,13 @@ spl_cache_grow(spl_kmem_cache_t *skc, int flags, void **obj)
         */
        remaining = wait_event_timeout(skc->skc_waitq,
                                       spl_cache_grow_wait(skc), 1);
-       if (remaining == 0)
-               rc = spl_emergency_alloc(skc, flags, obj);
+
+       if (remaining == 0) {
+               if (test_bit(KMC_BIT_NOEMERGENCY, &skc->skc_flags))
+                       rc = -ENOMEM;
+               else
+                       rc = spl_emergency_alloc(skc, flags, obj);
+       }
 
        SRETURN(rc);
 }