aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
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 e26bff5ed1a..c7ea5234c4e 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 /*