linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
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>

  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