aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mm/slab.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/mm/slab.c b/mm/slab.c
index e3260db04b9e..664c3a10acf2 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -331,6 +331,8 @@ static __always_inline int index_of(const size_t size)
331 return 0; 331 return 0;
332} 332}
333 333
334static int slab_early_init = 1;
335
334#define INDEX_AC index_of(sizeof(struct arraycache_init)) 336#define INDEX_AC index_of(sizeof(struct arraycache_init))
335#define INDEX_L3 index_of(sizeof(struct kmem_list3)) 337#define INDEX_L3 index_of(sizeof(struct kmem_list3))
336 338
@@ -1376,6 +1378,8 @@ void __init kmem_cache_init(void)
1376 NULL, NULL); 1378 NULL, NULL);
1377 } 1379 }
1378 1380
1381 slab_early_init = 0;
1382
1379 while (sizes->cs_size != ULONG_MAX) { 1383 while (sizes->cs_size != ULONG_MAX) {
1380 /* 1384 /*
1381 * For performance, all the general caches are L1 aligned. 1385 * For performance, all the general caches are L1 aligned.
@@ -2106,8 +2110,12 @@ kmem_cache_create (const char *name, size_t size, size_t align,
2106#endif 2110#endif
2107#endif 2111#endif
2108 2112
2109 /* Determine if the slab management is 'on' or 'off' slab. */ 2113 /*
2110 if (size >= (PAGE_SIZE >> 3)) 2114 * Determine if the slab management is 'on' or 'off' slab.
2115 * (bootstrapping cannot cope with offslab caches so don't do
2116 * it too early on.)
2117 */
2118 if ((size >= (PAGE_SIZE >> 3)) && !slab_early_init)
2111 /* 2119 /*
2112 * Size is large, assume best to place the slab management obj 2120 * Size is large, assume best to place the slab management obj
2113 * off-slab (should allow better packing of objs). 2121 * off-slab (should allow better packing of objs).