From: Glauber Costa <glommer@parallels.com>
To: Christoph Lameter <cl@linux.com>
Cc: Pekka Enberg <penberg@kernel.org>, Joonsoo Kim <js1304@gmail.com>,
linux-mm@kvack.org, David Rientjes <rientjes@google.com>
Subject: Re: CK1 [03/13] slub: Use a statically allocated kmem_cache boot structure for bootstrap
Date: Thu, 27 Sep 2012 17:25:26 +0400 [thread overview]
Message-ID: <506453C6.2050206@parallels.com> (raw)
In-Reply-To: <0000013a043cda28-b1405dff-7a18-49fc-93bf-4d418fbdd918-000000@email.amazonses.com>
On 09/27/2012 12:20 AM, Christoph Lameter wrote:
> Simplify bootstrap by statically allocated two kmem_cache structures. These are
> freed after bootup is complete. Allows us to no longer worry about calculations
> of sizes of kmem_cache structures during bootstrap.
>
> V1->V2: Do not unlock mutexes that are not taken during early boot.
>
This V1->V2 change makes sense, btw.
> Reviewed-by: Glauber Costa <glommer@parallels.com>
> Signed-off-by: Christoph Lameter <cl@linux.com>
> ---
> mm/slub.c | 41 +++++++++++------------------------------
> 1 file changed, 11 insertions(+), 30 deletions(-)
>
> Index: linux/mm/slub.c
> ===================================================================
> --- linux.orig/mm/slub.c 2012-09-19 09:21:14.422971030 -0500
> +++ linux/mm/slub.c 2012-09-19 09:21:18.403053765 -0500
> @@ -3649,9 +3649,6 @@ static void __init kmem_cache_bootstrap_
> {
> int node;
>
> - list_add(&s->list, &slab_caches);
> - s->refcount = -1;
> -
> for_each_node_state(node, N_NORMAL_MEMORY) {
> struct kmem_cache_node *n = get_node(s, node);
> struct page *p;
> @@ -3668,14 +3665,13 @@ static void __init kmem_cache_bootstrap_
> }
> }
>
> +static __initdata struct kmem_cache boot_kmem_cache,
> + boot_kmem_cache_node;
> +
> void __init kmem_cache_init(void)
> {
> int i;
> - int caches = 0;
> - struct kmem_cache *temp_kmem_cache;
> - int order;
> - struct kmem_cache *temp_kmem_cache_node;
> - unsigned long kmalloc_size;
> + int caches = 2;
>
> if (debug_guardpage_minorder())
> slub_max_order = 0;
> @@ -3683,53 +3679,32 @@ void __init kmem_cache_init(void)
> kmem_size = offsetof(struct kmem_cache, node) +
> nr_node_ids * sizeof(struct kmem_cache_node *);
>
> - /* Allocate two kmem_caches from the page allocator */
> - kmalloc_size = ALIGN(kmem_size, cache_line_size());
> - order = get_order(2 * kmalloc_size);
> - kmem_cache = (void *)__get_free_pages(GFP_NOWAIT | __GFP_ZERO, order);
> -
> - /*
> - * Must first have the slab cache available for the allocations of the
> - * struct kmem_cache_node's. There is special bootstrap code in
> - * kmem_cache_open for slab_state == DOWN.
> - */
> - kmem_cache_node = (void *)kmem_cache + kmalloc_size;
> + kmem_cache_node = &boot_kmem_cache_node;
>
> - kmem_cache_node->name = "kmem_cache_node";
> - kmem_cache_node->size = kmem_cache_node->object_size =
> - sizeof(struct kmem_cache_node);
> - kmem_cache_open(kmem_cache_node, SLAB_HWCACHE_ALIGN | SLAB_PANIC);
> + create_boot_cache(kmem_cache_node, "kmem_cache_node",
> + sizeof(struct kmem_cache_node), SLAB_HWCACHE_ALIGN);
>
> hotplug_memory_notifier(slab_memory_callback, SLAB_CALLBACK_PRI);
>
> /* Able to allocate the per node structures */
> slab_state = PARTIAL;
>
> - temp_kmem_cache = kmem_cache;
> - kmem_cache->name = "kmem_cache";
> - kmem_cache->size = kmem_cache->object_size = kmem_size;
> - kmem_cache_open(kmem_cache, SLAB_HWCACHE_ALIGN | SLAB_PANIC);
> + create_boot_cache(&boot_kmem_cache, "kmem_cache", kmem_size,
> + SLAB_HWCACHE_ALIGN);
>
> - kmem_cache = kmem_cache_alloc(kmem_cache, GFP_NOWAIT);
> - memcpy(kmem_cache, temp_kmem_cache, kmem_size);
> + kmem_cache = kmem_cache_alloc(&boot_kmem_cache, GFP_NOWAIT);
> + memcpy(kmem_cache, &boot_kmem_cache, kmem_size);
>
> /*
> * Allocate kmem_cache_node properly from the kmem_cache slab.
> * kmem_cache_node is separately allocated so no need to
> * update any list pointers.
> */
> - temp_kmem_cache_node = kmem_cache_node;
> -
> kmem_cache_node = kmem_cache_alloc(kmem_cache, GFP_NOWAIT);
> - memcpy(kmem_cache_node, temp_kmem_cache_node, kmem_size);
> + memcpy(kmem_cache_node, &boot_kmem_cache_node, kmem_size);
>
> kmem_cache_bootstrap_fixup(kmem_cache_node);
> -
> - caches++;
> kmem_cache_bootstrap_fixup(kmem_cache);
> - caches++;
> - /* Free temporary boot structure */
> - free_pages((unsigned long)temp_kmem_cache, order);
>
> /* Now we can use the kmem_cache to allocate kmalloc slabs */
>
> @@ -3930,6 +3905,10 @@ int __kmem_cache_create(struct kmem_cach
> if (err)
> return err;
>
> + /* Mutex is not taken during early boot */
> + if (slab_state <= UP)
> + return 0;
> +
> mutex_unlock(&slab_mutex);
> err = sysfs_slab_add(s);
> mutex_lock(&slab_mutex);
>
> --
> 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>
>
--
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-09-27 13:28 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20120926200005.911809821@linux.com>
2012-09-26 20:01 ` CK1 [02/13] create common functions for boot slab creation Christoph Lameter
2012-09-27 13:22 ` Glauber Costa
2012-09-26 20:01 ` CK1 [01/13] slab: Simplify bootstrap Christoph Lameter
2012-09-26 20:07 ` CK1 [09/13] slab: rename nodelists to node Christoph Lameter
2012-09-28 8:42 ` Glauber Costa
2012-09-28 14:45 ` Christoph Lameter
2012-09-26 20:07 ` CK1 [08/13] slab: Common name for the per node structures Christoph Lameter
2012-09-28 8:38 ` Glauber Costa
2012-09-28 14:21 ` Christoph Lameter
2012-09-26 20:18 ` CK1 [10/13] Do not define KMALLOC array definitions for SLOB Christoph Lameter
2012-09-28 8:44 ` Glauber Costa
2012-09-28 17:11 ` Christoph Lameter
2012-09-26 20:18 ` CK1 [07/13] slab: Use common kmalloc_index/kmalloc_size functions Christoph Lameter
2012-09-28 8:36 ` Glauber Costa
2012-09-28 14:20 ` Christoph Lameter
2012-09-26 20:18 ` CK1 [04/13] slab: Use the new create_boot_cache function to simplify bootstrap Christoph Lameter
2012-09-27 13:24 ` Glauber Costa
2012-09-27 14:32 ` Christoph Lameter
2012-09-27 14:33 ` Glauber Costa
2012-09-26 20:20 ` CK1 [11/13] Common constants for kmalloc boundaries Christoph Lameter
2012-09-26 20:20 ` CK1 [12/13] Common names for the array of kmalloc caches Christoph Lameter
2012-09-26 20:20 ` CK1 [05/13] Common alignment code Christoph Lameter
2012-09-26 20:20 ` CK1 [06/13] Common kmalloc slab index determination Christoph Lameter
2012-09-28 8:27 ` Glauber Costa
2012-09-28 14:16 ` Christoph Lameter
2012-09-26 20:20 ` CK1 [03/13] slub: Use a statically allocated kmem_cache boot structure for bootstrap Christoph Lameter
2012-09-27 13:25 ` Glauber Costa [this message]
2012-09-26 20:29 ` CK1 [13/13] Common function to create the kmalloc array Christoph Lameter
2012-09-28 8:51 ` Glauber Costa
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=506453C6.2050206@parallels.com \
--to=glommer@parallels.com \
--cc=cl@linux.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.