From: Pekka Enberg <penberg@cs.helsinki.fi>
To: Christoph Lameter <cl@linux-foundation.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>,
David Rientjes <rientjes@google.com>,
linux-mm@kvack.org, Roland Dreier <rdreier@cisco.com>,
linux-kernel@vger.kernel.org, Nick Piggin <npiggin@suse.de>
Subject: Re: [S+Q2 07/19] slub: Allow removal of slab caches during boot
Date: Sat, 31 Jul 2010 12:41:14 +0300 [thread overview]
Message-ID: <4C53EFBA.4090900@cs.helsinki.fi> (raw)
In-Reply-To: <alpine.DEB.2.00.1007191058220.29361@router.home>
Christoph Lameter wrote:
>> Ok so I may be a bit sleepy or something but I still fail to see how
>> this whole thing isn't totally racy...
>>
>> AFAIK. By the time we switch the slab state, we -do- have all CPUs up
>> and can race happily between creating slab caches and creating the sysfs
>> files...
>
> If kmem_cache_init_late() is called after all other processors are up then
> we need to serialize the activities. But we cannot do that since the
> slub_lock is taken during kmalloc() for dynamic dma creation (lockdep
> will complain although we never use dma caches for sysfs....).
>
> After removal of dynamic dma creation we can take the lock for all of slab
> creation and removal.
>
> Like in the following patch:
>
> Subject: slub: Allow removal of slab caches during boot
>
> Serialize kmem_cache_create and kmem_cache_destroy using the slub_lock. Only
> possible after the use of the slub_lock during dynamic dma creation has been
> removed.
>
> Then make sure that the setup of the slab sysfs entries does not race
> with kmem_cache_create and kmem_cache destroy.
>
> If a slab cache is removed before we have setup sysfs then simply skip over
> the sysfs handling.
>
> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> Cc: Roland Dreier <rdreier@cisco.com>
> Signed-off-by: Christoph Lameter <cl@linux-foundation.org>
Christoph, Ben, should I queue this up for 2.6.36?
>
> ---
> mm/slub.c | 24 +++++++++++++++---------
> 1 file changed, 15 insertions(+), 9 deletions(-)
>
> Index: linux-2.6/mm/slub.c
> ===================================================================
> --- linux-2.6.orig/mm/slub.c 2010-07-19 11:02:15.000000000 -0500
> +++ linux-2.6/mm/slub.c 2010-07-19 11:33:32.000000000 -0500
> @@ -2490,7 +2490,6 @@ void kmem_cache_destroy(struct kmem_cach
> s->refcount--;
> if (!s->refcount) {
> list_del(&s->list);
> - up_write(&slub_lock);
> if (kmem_cache_close(s)) {
> printk(KERN_ERR "SLUB %s: %s called for cache that "
> "still has objects.\n", s->name, __func__);
> @@ -2499,8 +2498,8 @@ void kmem_cache_destroy(struct kmem_cach
> if (s->flags & SLAB_DESTROY_BY_RCU)
> rcu_barrier();
> sysfs_slab_remove(s);
> - } else
> - up_write(&slub_lock);
> + }
> + up_write(&slub_lock);
> }
> EXPORT_SYMBOL(kmem_cache_destroy);
>
> @@ -3226,14 +3225,12 @@ struct kmem_cache *kmem_cache_create(con
> */
> s->objsize = max(s->objsize, (int)size);
> s->inuse = max_t(int, s->inuse, ALIGN(size, sizeof(void *)));
> - up_write(&slub_lock);
>
> if (sysfs_slab_alias(s, name)) {
> - down_write(&slub_lock);
> s->refcount--;
> - up_write(&slub_lock);
> goto err;
> }
> + up_write(&slub_lock);
> return s;
> }
>
> @@ -3242,14 +3239,12 @@ struct kmem_cache *kmem_cache_create(con
> if (kmem_cache_open(s, GFP_KERNEL, name,
> size, align, flags, ctor)) {
> list_add(&s->list, &slab_caches);
> - up_write(&slub_lock);
> if (sysfs_slab_add(s)) {
> - down_write(&slub_lock);
> list_del(&s->list);
> - up_write(&slub_lock);
> kfree(s);
> goto err;
> }
> + up_write(&slub_lock);
> return s;
> }
> kfree(s);
> @@ -4507,6 +4502,13 @@ static int sysfs_slab_add(struct kmem_ca
>
> static void sysfs_slab_remove(struct kmem_cache *s)
> {
> + if (slab_state < SYSFS)
> + /*
> + * Sysfs has not been setup yet so no need to remove the
> + * cache from sysfs.
> + */
> + return;
> +
> kobject_uevent(&s->kobj, KOBJ_REMOVE);
> kobject_del(&s->kobj);
> kobject_put(&s->kobj);
> @@ -4552,8 +4554,11 @@ static int __init slab_sysfs_init(void)
> struct kmem_cache *s;
> int err;
>
> + down_write(&slub_lock);
> +
> slab_kset = kset_create_and_add("slab", &slab_uevent_ops, kernel_kobj);
> if (!slab_kset) {
> + up_write(&slub_lock);
> printk(KERN_ERR "Cannot register slab subsystem.\n");
> return -ENOSYS;
> }
> @@ -4578,6 +4583,7 @@ static int __init slab_sysfs_init(void)
> kfree(al);
> }
>
> + up_write(&slub_lock);
> resiliency_test();
> return 0;
> }
>
>
WARNING: multiple messages have this Message-ID (diff)
From: Pekka Enberg <penberg@cs.helsinki.fi>
To: Christoph Lameter <cl@linux-foundation.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>,
David Rientjes <rientjes@google.com>,
linux-mm@kvack.org, Roland Dreier <rdreier@cisco.com>,
linux-kernel@vger.kernel.org, Nick Piggin <npiggin@suse.de>
Subject: Re: [S+Q2 07/19] slub: Allow removal of slab caches during boot
Date: Sat, 31 Jul 2010 12:41:14 +0300 [thread overview]
Message-ID: <4C53EFBA.4090900@cs.helsinki.fi> (raw)
In-Reply-To: <alpine.DEB.2.00.1007191058220.29361@router.home>
Christoph Lameter wrote:
>> Ok so I may be a bit sleepy or something but I still fail to see how
>> this whole thing isn't totally racy...
>>
>> AFAIK. By the time we switch the slab state, we -do- have all CPUs up
>> and can race happily between creating slab caches and creating the sysfs
>> files...
>
> If kmem_cache_init_late() is called after all other processors are up then
> we need to serialize the activities. But we cannot do that since the
> slub_lock is taken during kmalloc() for dynamic dma creation (lockdep
> will complain although we never use dma caches for sysfs....).
>
> After removal of dynamic dma creation we can take the lock for all of slab
> creation and removal.
>
> Like in the following patch:
>
> Subject: slub: Allow removal of slab caches during boot
>
> Serialize kmem_cache_create and kmem_cache_destroy using the slub_lock. Only
> possible after the use of the slub_lock during dynamic dma creation has been
> removed.
>
> Then make sure that the setup of the slab sysfs entries does not race
> with kmem_cache_create and kmem_cache destroy.
>
> If a slab cache is removed before we have setup sysfs then simply skip over
> the sysfs handling.
>
> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> Cc: Roland Dreier <rdreier@cisco.com>
> Signed-off-by: Christoph Lameter <cl@linux-foundation.org>
Christoph, Ben, should I queue this up for 2.6.36?
>
> ---
> mm/slub.c | 24 +++++++++++++++---------
> 1 file changed, 15 insertions(+), 9 deletions(-)
>
> Index: linux-2.6/mm/slub.c
> ===================================================================
> --- linux-2.6.orig/mm/slub.c 2010-07-19 11:02:15.000000000 -0500
> +++ linux-2.6/mm/slub.c 2010-07-19 11:33:32.000000000 -0500
> @@ -2490,7 +2490,6 @@ void kmem_cache_destroy(struct kmem_cach
> s->refcount--;
> if (!s->refcount) {
> list_del(&s->list);
> - up_write(&slub_lock);
> if (kmem_cache_close(s)) {
> printk(KERN_ERR "SLUB %s: %s called for cache that "
> "still has objects.\n", s->name, __func__);
> @@ -2499,8 +2498,8 @@ void kmem_cache_destroy(struct kmem_cach
> if (s->flags & SLAB_DESTROY_BY_RCU)
> rcu_barrier();
> sysfs_slab_remove(s);
> - } else
> - up_write(&slub_lock);
> + }
> + up_write(&slub_lock);
> }
> EXPORT_SYMBOL(kmem_cache_destroy);
>
> @@ -3226,14 +3225,12 @@ struct kmem_cache *kmem_cache_create(con
> */
> s->objsize = max(s->objsize, (int)size);
> s->inuse = max_t(int, s->inuse, ALIGN(size, sizeof(void *)));
> - up_write(&slub_lock);
>
> if (sysfs_slab_alias(s, name)) {
> - down_write(&slub_lock);
> s->refcount--;
> - up_write(&slub_lock);
> goto err;
> }
> + up_write(&slub_lock);
> return s;
> }
>
> @@ -3242,14 +3239,12 @@ struct kmem_cache *kmem_cache_create(con
> if (kmem_cache_open(s, GFP_KERNEL, name,
> size, align, flags, ctor)) {
> list_add(&s->list, &slab_caches);
> - up_write(&slub_lock);
> if (sysfs_slab_add(s)) {
> - down_write(&slub_lock);
> list_del(&s->list);
> - up_write(&slub_lock);
> kfree(s);
> goto err;
> }
> + up_write(&slub_lock);
> return s;
> }
> kfree(s);
> @@ -4507,6 +4502,13 @@ static int sysfs_slab_add(struct kmem_ca
>
> static void sysfs_slab_remove(struct kmem_cache *s)
> {
> + if (slab_state < SYSFS)
> + /*
> + * Sysfs has not been setup yet so no need to remove the
> + * cache from sysfs.
> + */
> + return;
> +
> kobject_uevent(&s->kobj, KOBJ_REMOVE);
> kobject_del(&s->kobj);
> kobject_put(&s->kobj);
> @@ -4552,8 +4554,11 @@ static int __init slab_sysfs_init(void)
> struct kmem_cache *s;
> int err;
>
> + down_write(&slub_lock);
> +
> slab_kset = kset_create_and_add("slab", &slab_uevent_ops, kernel_kobj);
> if (!slab_kset) {
> + up_write(&slub_lock);
> printk(KERN_ERR "Cannot register slab subsystem.\n");
> return -ENOSYS;
> }
> @@ -4578,6 +4583,7 @@ static int __init slab_sysfs_init(void)
> kfree(al);
> }
>
> + up_write(&slub_lock);
> resiliency_test();
> return 0;
> }
>
>
--
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:[~2010-07-31 9:41 UTC|newest]
Thread overview: 85+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-07-09 19:07 [S+Q2 00/19] SLUB with queueing (V2) beats SLAB netperf TCP_RR Christoph Lameter
2010-07-09 19:07 ` Christoph Lameter
2010-07-09 19:07 ` [S+Q2 01/19] Bugfix for semop() not reporting successful operation Christoph Lameter
2010-07-09 19:07 ` Christoph Lameter
2010-07-09 19:07 ` [S+Q2 02/19] percpu: make @dyn_size always mean min dyn_size in first chunk init functions Christoph Lameter
2010-07-09 19:07 ` Christoph Lameter
2010-07-09 19:07 ` [S+Q2 03/19] percpu: allow limited allocation before slab is online Christoph Lameter
2010-07-09 19:07 ` Christoph Lameter
2010-07-09 19:07 ` [S+Q2 04/19] slub: Use a constant for a unspecified node Christoph Lameter
2010-07-09 19:07 ` Christoph Lameter
2010-07-09 19:07 ` [S+Q2 05/19] SLUB: Constants need UL Christoph Lameter
2010-07-09 19:07 ` Christoph Lameter
2010-07-09 19:07 ` [S+Q2 06/19] slub: Check kasprintf results in kmem_cache_init() Christoph Lameter
2010-07-09 19:07 ` Christoph Lameter
2010-07-14 22:16 ` David Rientjes
2010-07-14 22:16 ` David Rientjes
2010-07-09 19:07 ` [S+Q2 07/19] slub: Allow removal of slab caches during boot Christoph Lameter
2010-07-09 19:07 ` Christoph Lameter
2010-07-14 23:48 ` David Rientjes
2010-07-14 23:48 ` David Rientjes
2010-07-19 0:07 ` Benjamin Herrenschmidt
2010-07-19 0:07 ` Benjamin Herrenschmidt
2010-07-19 16:39 ` Christoph Lameter
2010-07-19 16:39 ` Christoph Lameter
2010-07-31 9:41 ` Pekka Enberg [this message]
2010-07-31 9:41 ` Pekka Enberg
2010-08-02 15:36 ` Christoph Lameter
2010-08-02 15:36 ` Christoph Lameter
2010-08-03 4:32 ` Pekka Enberg
2010-08-03 4:32 ` Pekka Enberg
2010-07-09 19:07 ` [S+Q2 08/19] slub: Use kmem_cache flags to detect if slab is in debugging mode Christoph Lameter
2010-07-09 19:07 ` Christoph Lameter
2010-07-09 19:07 ` [S+Q2 09/19] slub: discard_slab_unlock Christoph Lameter
2010-07-09 19:07 ` Christoph Lameter
2010-07-09 19:07 ` [S+Q2 10/19] slub: remove dynamic dma slab allocation Christoph Lameter
2010-07-09 19:07 ` Christoph Lameter
2010-07-09 19:07 ` [S+Q2 11/19] slub: Remove static kmem_cache_cpu array for boot Christoph Lameter
2010-07-09 19:07 ` Christoph Lameter
2010-07-09 19:07 ` [S+Q2 12/19] slub: Dynamically size kmalloc cache allocations Christoph Lameter
2010-07-09 19:07 ` Christoph Lameter
2010-07-09 19:07 ` [S+Q2 13/19] slub: Extract hooks for memory checkers from hotpaths Christoph Lameter
2010-07-09 19:07 ` Christoph Lameter
2010-07-09 19:07 ` [S+Q2 14/19] slub: Move gfpflag masking out of the hotpath Christoph Lameter
2010-07-09 19:07 ` Christoph Lameter
2010-07-09 19:07 ` [S+Q2 15/19] SLUB: Add SLAB style per cpu queueing Christoph Lameter
2010-07-09 19:07 ` Christoph Lameter
2010-07-09 19:07 ` [S+Q2 16/19] slub: Resize the new cpu queues Christoph Lameter
2010-07-09 19:07 ` Christoph Lameter
2010-07-09 19:07 ` [S+Q2 17/19] SLUB: Get rid of useless function count_free() Christoph Lameter
2010-07-09 19:07 ` Christoph Lameter
2010-07-09 19:07 ` [S+Q2 18/19] SLUB: Remove MAX_OBJS limitation Christoph Lameter
2010-07-09 19:07 ` Christoph Lameter
2010-07-09 19:07 ` [S+Q2 19/19] slub: Drop allocator announcement Christoph Lameter
2010-07-09 19:07 ` Christoph Lameter
2010-07-10 19:56 ` [S+Q2 00/19] SLUB with queueing (V2) beats SLAB netperf TCP_RR Heinz Diehl
2010-07-10 19:56 ` Heinz Diehl
2010-07-12 15:11 ` Christoph Lameter
2010-07-12 16:39 ` Heinz Diehl
2010-07-12 17:00 ` Christoph Lameter
2010-07-12 17:00 ` Christoph Lameter
2010-07-13 13:56 ` Heinz Diehl
2010-07-14 2:01 ` Christoph Lameter
2010-07-14 2:01 ` Christoph Lameter
2010-07-14 11:51 ` Tejun Heo
2010-07-14 11:51 ` Tejun Heo
2010-07-14 14:25 ` Heinz Diehl
2010-07-14 14:25 ` Heinz Diehl
2010-07-14 20:22 ` David Rientjes
2010-07-14 20:22 ` David Rientjes
2010-07-14 11:46 ` Tejun Heo
2010-07-14 11:46 ` Tejun Heo
2010-07-14 22:26 ` David Rientjes
2010-07-14 22:26 ` David Rientjes
2010-07-15 20:17 ` Christoph Lameter
2010-07-15 20:17 ` Christoph Lameter
2010-07-15 20:30 ` David Rientjes
2010-07-15 20:30 ` David Rientjes
2010-07-14 23:52 ` David Rientjes
2010-07-14 23:52 ` David Rientjes
2010-07-16 8:23 ` Pekka Enberg
2010-07-16 8:23 ` Pekka Enberg
2010-07-16 9:02 ` David Rientjes
2010-07-16 9:02 ` David Rientjes
2010-07-19 0:16 ` Benjamin Herrenschmidt
2010-07-19 0:16 ` Benjamin Herrenschmidt
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=4C53EFBA.4090900@cs.helsinki.fi \
--to=penberg@cs.helsinki.fi \
--cc=benh@kernel.crashing.org \
--cc=cl@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=npiggin@suse.de \
--cc=rdreier@cisco.com \
--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.