linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Christoph Lameter <cl@linux.com>
To: Glauber Costa <glommer@parallels.com>
Cc: Pekka Enberg <penberg@kernel.org>,
	linux-mm@kvack.org, David Rientjes <rientjes@google.com>,
	Joonsoo Kim <js1304@gmail.com>
Subject: Common10 [17/20] slab: Simplify bootstrap
Date: Fri, 03 Aug 2012 14:21:09 -0500	[thread overview]
Message-ID: <20120803192157.697774094@linux.com> (raw)
In-Reply-To: 20120803192052.448575403@linux.com

[-- Attachment #1: setup_nodelists --]
[-- Type: text/plain, Size: 3455 bytes --]

The nodelists field in kmem_cache is pointing to the first unused
object in the array field when bootstrap is complete.

On boot we use a statically allocated array for that purpose.

A problem with the current approach is that the statically sized
kmem_cache structure 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 simplify bootstrap.

Signed-off-by: Christoph Lameter <cl@linux.com>

Index: linux-2.6/include/linux/slab_def.h
===================================================================
--- linux-2.6.orig/include/linux/slab_def.h	2012-08-03 13:17:27.000000000 -0500
+++ linux-2.6/include/linux/slab_def.h	2012-08-03 13:48:01.257871286 -0500
@@ -92,7 +92,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];
 	/*
 	 * Do not add fields after array[]
 	 */
Index: linux-2.6/mm/slab.c
===================================================================
--- linux-2.6.orig/mm/slab.c	2012-08-03 13:46:46.000000000 -0500
+++ linux-2.6/mm/slab.c	2012-08-03 13:48:25.122303959 -0500
@@ -585,9 +585,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,
@@ -1579,6 +1577,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)
+{
+	s->nodelists = (struct kmem_list3 **)&s->array[nr_cpu_ids];
+}
+
+/*
  * Initialisation.  Called after the page allocator have been initialised and
  * before smp_init().
  */
@@ -1592,13 +1599,15 @@ 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++) {
 		kmem_list3_init(&initkmem_list3[i]);
-		if (i < MAX_NUMNODES)
+		if (i < nr_node_ids)
 			kmem_cache->nodelists[i] = NULL;
 	}
 	set_up_list3s(kmem_cache, CACHE_CACHE);
@@ -1638,7 +1647,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
@@ -2451,7 +2459,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>

  parent reply	other threads:[~2012-08-03 19:21 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-08-03 19:20 Common10 [00/20] Sl[auo]b: Common code rework V10 Christoph Lameter
2012-08-03 19:20 ` Common10 [01/20] slub: Add debugging to verify correct cache use on kmem_cache_free() Christoph Lameter
2012-08-03 19:20 ` Common10 [02/20] slub: Use kmem_cache for the kmem_cache structure Christoph Lameter
2012-08-03 19:20 ` Common10 [03/20] Rename oops label Christoph Lameter
2012-08-03 19:20 ` Common10 [04/20] Improve error handling in kmem_cache_create Christoph Lameter
2012-08-03 19:20 ` Common10 [05/20] Move list_add() to slab_common.c Christoph Lameter
2012-08-04 17:01   ` JoonSoo Kim
2012-08-08 14:47     ` Christoph Lameter (Open Source)
2012-08-03 19:20 ` Common10 [06/20] Extract a common function for kmem_cache_destroy Christoph Lameter
2012-08-04 17:21   ` JoonSoo Kim
2012-08-08 14:51     ` Christoph Lameter (Open Source)
2012-08-03 19:20 ` Common10 [07/20] Always use the name "kmem_cache" for the slab cache with the kmem_cache structure Christoph Lameter
2012-08-03 19:21 ` Common10 [08/20] Move freeing of kmem_cache structure to common code Christoph Lameter
2012-08-03 19:21 ` Common10 [09/20] Get rid of __kmem_cache_destroy Christoph Lameter
2012-08-03 19:21 ` Common10 [10/20] Move duping of slab name to slab_common.c Christoph Lameter
2012-08-04 17:34   ` JoonSoo Kim
2012-08-08 14:59     ` Christoph Lameter (Open Source)
2012-08-14 18:42       ` JoonSoo Kim
2012-08-03 19:21 ` Common10 [11/20] Do slab aliasing call from common code Christoph Lameter
2012-08-04 17:44   ` JoonSoo Kim
2012-08-08 15:40     ` Christoph Lameter (Open Source)
2012-08-03 19:21 ` Common10 [12/20] Move sysfs_slab_add to common Christoph Lameter
2012-08-04 17:46   ` JoonSoo Kim
2012-08-08 15:51     ` Christoph Lameter (Open Source)
2012-08-03 19:21 ` Common10 [13/20] Move kmem_cache allocations into common code Christoph Lameter
2012-08-04 17:48   ` JoonSoo Kim
2012-08-08 17:31     ` Christoph Lameter (Open Source)
2012-08-08 13:51   ` Glauber Costa
2012-08-08 17:56     ` Christoph Lameter (Open Source)
2012-08-03 19:21 ` Common10 [14/20] Shrink __kmem_cache_create() parameter lists Christoph Lameter
2012-08-08 13:15   ` Glauber Costa
2012-08-08 17:45     ` Christoph Lameter (Open Source)
2012-08-03 19:21 ` Common10 [15/20] Move kmem_cache refcounting to common code Christoph Lameter
2012-08-03 19:21 ` Common10 [16/20] slub: Use a statically allocated kmem_cache boot structure for bootstrap Christoph Lameter
2012-08-04 17:50   ` JoonSoo Kim
2012-08-03 19:21 ` Christoph Lameter [this message]
2012-08-03 19:21 ` Common10 [18/20] create common functions for boot slab creation Christoph Lameter
2012-08-03 19:21 ` Common10 [19/20] slab: Use the new create_boot_cache function to simplify bootstrap Christoph Lameter
2012-08-03 19:21 ` Common10 [20/20] Common alignment code 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=20120803192157.697774094@linux.com \
    --to=cl@linux.com \
    --cc=glommer@parallels.com \
    --cc=js1304@gmail.com \
    --cc=linux-mm@kvack.org \
    --cc=penberg@kernel.org \
    --cc=rientjes@google.com \
    /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;
as well as URLs for NNTP newsgroup(s).