From: David Rientjes <rientjes@google.com>
To: Christoph Lameter <cl@linux.com>
Cc: Pekka Enberg <penberg@kernel.org>, Joonsoo Kim <js1304@gmail.com>,
Glauber Costa <glommer@parallels.com>,
linux-mm@kvack.org, elezegarcia@gmail.com
Subject: Re: CK5 [02/18] slab: Simplify bootstrap
Date: Fri, 2 Nov 2012 13:22:51 -0700 (PDT) [thread overview]
Message-ID: <alpine.DEB.2.00.1211021314590.5902@chino.kir.corp.google.com> (raw)
In-Reply-To: <0000013abdf0becf-a3e4ca1c-e164-4445-b1ff-d253af740700-000000@email.amazonses.com>
On Thu, 1 Nov 2012, Christoph Lameter wrote:
> 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.
>
> V1->V2:
> - No need to zap kmem_cache->nodelists since it is allocated
> with kmem_cache_zalloc() [glommer]
>
> Acked-by: Glauber Costa <glommer@parallels.com>
> Signed-off-by: Christoph Lameter <cl@linux.com>
> ---
> include/linux/slab_def.h | 2 +-
> mm/slab.c | 18 +++++++++++++-----
> 2 files changed, 14 insertions(+), 6 deletions(-)
>
> Index: linux/include/linux/slab_def.h
> ===================================================================
> --- linux.orig/include/linux/slab_def.h 2012-11-01 10:09:47.073417947 -0500
> +++ linux/include/linux/slab_def.h 2012-11-01 10:09:55.357555494 -0500
> @@ -91,7 +91,7 @@ struct kmem_cache {
> * is statically defined, so we reserve the max number of cpus.
> */
> struct kmem_list3 **nodelists;
> - struct array_cache *array[NR_CPUS];
> + struct array_cache *array[NR_CPUS + MAX_NUMNODES];
Needs to update the comment which specifies this is only sized to NR_CPUS.
> /*
> * Do not add fields after array[]
> */
> Index: linux/mm/slab.c
> ===================================================================
> --- linux.orig/mm/slab.c 2012-11-01 10:09:47.073417947 -0500
> +++ linux/mm/slab.c 2012-11-01 10:09:55.361555562 -0500
> @@ -553,9 +553,7 @@ static struct arraycache_init initarray_
> { {0, BOOT_CPUCACHE_ENTRIES, 1, 0} };
>
> /* internal cache of cache description objs */
> -static struct kmem_list3 *kmem_cache_nodelists[MAX_NUMNODES];
> static struct kmem_cache kmem_cache_boot = {
> - .nodelists = kmem_cache_nodelists,
> .batchcount = 1,
> .limit = BOOT_CPUCACHE_ENTRIES,
> .shared = 1,
> @@ -1560,6 +1558,15 @@ static void __init set_up_list3s(struct
> }
>
> /*
> + * The memory after the last cpu cache pointer is used for the
> + * the nodelists pointer.
> + */
> +static void setup_nodelists_pointer(struct kmem_cache *s)
cachep
> +{
> + s->nodelists = (struct kmem_list3 **)&s->array[nr_cpu_ids];
> +}
> +
> +/*
> * Initialisation. Called after the page allocator have been initialised and
> * before smp_init().
> */
> @@ -1573,15 +1580,14 @@ void __init kmem_cache_init(void)
> int node;
>
> kmem_cache = &kmem_cache_boot;
> + setup_nodelists_pointer(kmem_cache);
>
> if (num_possible_nodes() == 1)
> use_alien_caches = 0;
>
> - for (i = 0; i < NUM_INIT_LISTS; i++) {
> + for (i = 0; i < NUM_INIT_LISTS; i++)
> kmem_list3_init(&initkmem_list3[i]);
> - if (i < MAX_NUMNODES)
> - kmem_cache->nodelists[i] = NULL;
> - }
> +
> set_up_list3s(kmem_cache, CACHE_CACHE);
>
> /*
> @@ -1619,7 +1625,6 @@ void __init kmem_cache_init(void)
> list_add(&kmem_cache->list, &slab_caches);
> kmem_cache->colour_off = cache_line_size();
> kmem_cache->array[smp_processor_id()] = &initarray_cache.cache;
> - kmem_cache->nodelists[node] = &initkmem_list3[CACHE_CACHE + node];
>
> /*
> * struct kmem_cache size depends on nr_node_ids & nr_cpu_ids
> @@ -2425,7 +2430,7 @@ __kmem_cache_create (struct kmem_cache *
> else
> gfp = GFP_NOWAIT;
>
> - cachep->nodelists = (struct kmem_list3 **)&cachep->array[nr_cpu_ids];
> + setup_nodelists_pointer(cachep);
> #if DEBUG
>
> /*
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2012-11-02 20:22 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20121101214538.971500204@linux.com>
2012-11-01 21:46 ` CK5 [01/18] Use correct cpu_slab on dead cpu Christoph Lameter
2012-11-02 20:11 ` David Rientjes
2012-11-01 21:46 ` CK5 [02/18] slab: Simplify bootstrap Christoph Lameter
2012-11-02 20:22 ` David Rientjes [this message]
2012-11-05 15:11 ` Christoph Lameter
2012-11-01 21:47 ` CK5 [05/18] slab: Use the new create_boot_cache function to simplify bootstrap Christoph Lameter
2012-11-01 21:47 ` CK5 [03/18] create common functions for boot slab creation Christoph Lameter
2012-11-02 20:34 ` David Rientjes
2012-11-05 15:15 ` Christoph Lameter
2012-11-05 21:52 ` David Rientjes
2012-11-01 21:47 ` CK5 [04/18] slub: Use a statically allocated kmem_cache boot structure for bootstrap Christoph Lameter
2012-11-01 21:47 ` CK5 [06/18] Common alignment code Christoph Lameter
2012-11-01 21:47 ` CK5 [07/18] Move kmalloc related function defs Christoph Lameter
2012-11-01 21:47 ` CK5 [12/18] Common constants for kmalloc boundaries Christoph Lameter
2012-11-01 21:48 ` CK5 [15/18] stat: Use size_t for sizes instead of unsigned Christoph Lameter
2012-11-01 21:48 ` CK5 [13/18] Common definition for the array of kmalloc caches Christoph Lameter
2012-11-01 21:48 ` CK5 [11/18] slab: rename nodelists to node Christoph Lameter
2012-11-01 21:48 ` CK5 [16/18] Common Kmalloc cache determination Christoph Lameter
2012-11-01 21:48 ` CK5 [14/18] Common function to create the kmalloc array Christoph Lameter
2012-11-01 21:48 ` CK5 [08/18] Common kmalloc slab index determination Christoph Lameter
2012-11-01 21:48 ` CK5 [09/18] slab: Use common kmalloc_index/kmalloc_size functions Christoph Lameter
2012-11-01 21:48 ` CK5 [17/18] slab: Rename list3/l3 to node Christoph Lameter
2012-11-01 21:48 ` CK5 [18/18] Common definition for kmem_cache_node Christoph Lameter
2012-11-01 21:55 ` CK5 [10/18] slab: Common name for the per node structures Christoph Lameter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=alpine.DEB.2.00.1211021314590.5902@chino.kir.corp.google.com \
--to=rientjes@google.com \
--cc=cl@linux.com \
--cc=elezegarcia@gmail.com \
--cc=glommer@parallels.com \
--cc=js1304@gmail.com \
--cc=linux-mm@kvack.org \
--cc=penberg@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox