diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/slab.c | 21 |
1 files changed, 13 insertions, 8 deletions
@@ -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 */ |
556 | static struct kmem_list3 *kmem_cache_nodelists[MAX_NUMNODES]; | ||
557 | static struct kmem_cache kmem_cache_boot = { | 556 | static 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 | */ | ||
1564 | static 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 | /* |