From: Christoph Lameter <cl@linux.com>
To: Pekka Enberg <penberg@kernel.org>
Cc: Joonsoo Kim <js1304@gmail.com>,
Glauber Costa <glommer@parallels.com>,
linux-mm@kvack.org, David Rientjes <rientjes@google.com>,
elezegarcia@gmail.com
Subject: CK5 [02/18] slab: Simplify bootstrap
Date: Thu, 1 Nov 2012 21:46:42 +0000 [thread overview]
Message-ID: <0000013abdf0becf-a3e4ca1c-e164-4445-b1ff-d253af740700-000000@email.amazonses.com> (raw)
In-Reply-To: <20121101214538.971500204@linux.com>
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];
/*
* 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)
+{
+ 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 parent reply other threads:[~2012-11-01 21:46 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 ` Christoph Lameter [this message]
2012-11-02 20:22 ` David Rientjes
2012-11-05 15:11 ` Christoph Lameter
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:47 ` CK5 [04/18] slub: Use a statically allocated kmem_cache boot structure for bootstrap 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 [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:47 ` CK5 [06/18] Common alignment code Christoph Lameter
2012-11-01 21:48 ` CK5 [11/18] slab: rename nodelists to node 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 [15/18] stat: Use size_t for sizes instead of unsigned 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 [18/18] Common definition for kmem_cache_node Christoph Lameter
2012-11-01 21:48 ` CK5 [17/18] slab: Rename list3/l3 to node Christoph Lameter
2012-11-01 21:48 ` CK5 [09/18] slab: Use common kmalloc_index/kmalloc_size functions 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=0000013abdf0becf-a3e4ca1c-e164-4445-b1ff-d253af740700-000000@email.amazonses.com \
--to=cl@linux.com \
--cc=elezegarcia@gmail.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