mm, slab/slub: introduce kmalloc-reclaimable caches
[linux-2.6-microblaze.git] / mm / slab_common.c
index d880b2a..5b19439 100644 (file)
@@ -1108,10 +1108,21 @@ void __init setup_kmalloc_cache_index_table(void)
        }
 }
 
-static void __init new_kmalloc_cache(int idx, slab_flags_t flags)
+static void __init
+new_kmalloc_cache(int idx, int type, slab_flags_t flags)
 {
-       kmalloc_caches[KMALLOC_NORMAL][idx] = create_kmalloc_cache(
-                                       kmalloc_info[idx].name,
+       const char *name;
+
+       if (type == KMALLOC_RECLAIM) {
+               flags |= SLAB_RECLAIM_ACCOUNT;
+               name = kasprintf(GFP_NOWAIT, "kmalloc-rcl-%u",
+                                               kmalloc_info[idx].size);
+               BUG_ON(!name);
+       } else {
+               name = kmalloc_info[idx].name;
+       }
+
+       kmalloc_caches[type][idx] = create_kmalloc_cache(name,
                                        kmalloc_info[idx].size, flags, 0,
                                        kmalloc_info[idx].size);
 }
@@ -1123,22 +1134,25 @@ static void __init new_kmalloc_cache(int idx, slab_flags_t flags)
  */
 void __init create_kmalloc_caches(slab_flags_t flags)
 {
-       int i;
-       int type = KMALLOC_NORMAL;
+       int i, type;
 
-       for (i = KMALLOC_SHIFT_LOW; i <= KMALLOC_SHIFT_HIGH; i++) {
-               if (!kmalloc_caches[type][i])
-                       new_kmalloc_cache(i, flags);
+       for (type = KMALLOC_NORMAL; type <= KMALLOC_RECLAIM; type++) {
+               for (i = KMALLOC_SHIFT_LOW; i <= KMALLOC_SHIFT_HIGH; i++) {
+                       if (!kmalloc_caches[type][i])
+                               new_kmalloc_cache(i, type, flags);
 
-               /*
-                * Caches that are not of the two-to-the-power-of size.
-                * These have to be created immediately after the
-                * earlier power of two caches
-                */
-               if (KMALLOC_MIN_SIZE <= 32 && !kmalloc_caches[type][1] && i == 6)
-                       new_kmalloc_cache(1, flags);
-               if (KMALLOC_MIN_SIZE <= 64 && !kmalloc_caches[type][2] && i == 7)
-                       new_kmalloc_cache(2, flags);
+                       /*
+                        * Caches that are not of the two-to-the-power-of size.
+                        * These have to be created immediately after the
+                        * earlier power of two caches
+                        */
+                       if (KMALLOC_MIN_SIZE <= 32 && i == 6 &&
+                                       !kmalloc_caches[type][1])
+                               new_kmalloc_cache(1, type, flags);
+                       if (KMALLOC_MIN_SIZE <= 64 && i == 7 &&
+                                       !kmalloc_caches[type][2])
+                               new_kmalloc_cache(2, type, flags);
+               }
        }
 
        /* Kmalloc array is now usable */