|
@@ -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 */
|