aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorChristoph Lameter <cl@linux.com>2012-11-28 11:23:01 -0500
committerPekka Enberg <penberg@kernel.org>2012-12-11 05:14:27 -0500
commit3c58346525d82625e68e24f071804c2dc057b6f4 (patch)
tree33dc428ff98a05bed75350b9cfc65e0f33f5ce43 /mm
parent59a09917c95e5209135b4f1a87f1263d6ef40fdb (diff)
slab: Simplify bootstrap
The nodelists field in kmem_cache is pointing to the first unused object in the array field when bootstrap is complete. A problem with the current approach is that the statically sized kmem_cache structure use on boot can only contain NR_CPUS entries. If the number of nodes plus the number of cpus is greater then we would overwrite memory following the kmem_cache_boot definition. Increase the size of the array field to ensure that also the node pointers fit into the array field. Once we do that we no longer need the kmem_cache_nodelists array and we can then also use that structure elsewhere. Acked-by: Glauber Costa <glommer@parallels.com> Signed-off-by: Christoph Lameter <cl@linux.com> Signed-off-by: Pekka Enberg <penberg@kernel.org>
Diffstat (limited to 'mm')
-rw-r--r--mm/slab.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/mm/slab.c b/mm/slab.c
index e26bff5ed1a6..c7ea5234c4e9 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -553,9 +553,7 @@ static struct arraycache_init initarray_generic =
553 { {0, BOOT_CPUCACHE_ENTRIES, 1, 0} }; 553 { {0, BOOT_CPUCACHE_ENTRIES, 1, 0} };
554 554
555/* internal cache of cache description objs */ 555/* internal cache of cache description objs */
556static struct kmem_list3 *kmem_cache_nodelists[MAX_NUMNODES];
557static struct kmem_cache kmem_cache_boot = { 556static struct kmem_cache kmem_cache_boot = {
558 .nodelists = kmem_cache_nodelists,
559 .batchcount = 1, 557 .batchcount = 1,
560 .limit = BOOT_CPUCACHE_ENTRIES, 558 .limit = BOOT_CPUCACHE_ENTRIES,
561 .shared = 1, 559 .shared = 1,
@@ -1560,6 +1558,15 @@ static void __init set_up_list3s(struct kmem_cache *cachep, int index)
1560} 1558}
1561 1559
1562/* 1560/*
1561 * The memory after the last cpu cache pointer is used for the
1562 * the nodelists pointer.
1563 */
1564static void setup_nodelists_pointer(struct kmem_cache *cachep)
1565{
1566 cachep->nodelists = (struct kmem_list3 **)&cachep->array[nr_cpu_ids];
1567}
1568
1569/*
1563 * Initialisation. Called after the page allocator have been initialised and 1570 * Initialisation. Called after the page allocator have been initialised and
1564 * before smp_init(). 1571 * before smp_init().
1565 */ 1572 */
@@ -1573,15 +1580,14 @@ void __init kmem_cache_init(void)
1573 int node; 1580 int node;
1574 1581
1575 kmem_cache = &kmem_cache_boot; 1582 kmem_cache = &kmem_cache_boot;
1583 setup_nodelists_pointer(kmem_cache);
1576 1584
1577 if (num_possible_nodes() == 1) 1585 if (num_possible_nodes() == 1)
1578 use_alien_caches = 0; 1586 use_alien_caches = 0;
1579 1587
1580 for (i = 0; i < NUM_INIT_LISTS; i++) { 1588 for (i = 0; i < NUM_INIT_LISTS; i++)
1581 kmem_list3_init(&initkmem_list3[i]); 1589 kmem_list3_init(&initkmem_list3[i]);
1582 if (i < MAX_NUMNODES) 1590
1583 kmem_cache->nodelists[i] = NULL;
1584 }
1585 set_up_list3s(kmem_cache, CACHE_CACHE); 1591 set_up_list3s(kmem_cache, CACHE_CACHE);
1586 1592
1587 /* 1593 /*
@@ -1619,7 +1625,6 @@ void __init kmem_cache_init(void)
1619 list_add(&kmem_cache->list, &slab_caches); 1625 list_add(&kmem_cache->list, &slab_caches);
1620 kmem_cache->colour_off = cache_line_size(); 1626 kmem_cache->colour_off = cache_line_size();
1621 kmem_cache->array[smp_processor_id()] = &initarray_cache.cache; 1627 kmem_cache->array[smp_processor_id()] = &initarray_cache.cache;
1622 kmem_cache->nodelists[node] = &initkmem_list3[CACHE_CACHE + node];
1623 1628
1624 /* 1629 /*
1625 * struct kmem_cache size depends on nr_node_ids & nr_cpu_ids 1630 * struct kmem_cache size depends on nr_node_ids & nr_cpu_ids
@@ -2422,7 +2427,7 @@ __kmem_cache_create (struct kmem_cache *cachep, unsigned long flags)
2422 else 2427 else
2423 gfp = GFP_NOWAIT; 2428 gfp = GFP_NOWAIT;
2424 2429
2425 cachep->nodelists = (struct kmem_list3 **)&cachep->array[nr_cpu_ids]; 2430 setup_nodelists_pointer(cachep);
2426#if DEBUG 2431#if DEBUG
2427 2432
2428 /* 2433 /*