linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
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;
>  }
> 
> 


  reply	other threads:[~2010-07-31  9:41 UTC|newest]

Thread overview: 44+ 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 ` [S+Q2 01/19] Bugfix for semop() not reporting successful operation 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 ` [S+Q2 03/19] percpu: allow limited allocation before slab is online 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 ` [S+Q2 05/19] SLUB: Constants need UL Christoph Lameter
2010-07-09 19:07 ` [S+Q2 06/19] slub: Check kasprintf results in kmem_cache_init() Christoph Lameter
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-14 23:48   ` David Rientjes
2010-07-19  0:07     ` Benjamin Herrenschmidt
2010-07-19 16:39       ` Christoph Lameter
2010-07-31  9:41         ` Pekka Enberg [this message]
2010-08-02 15:36           ` Christoph Lameter
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 ` [S+Q2 09/19] slub: discard_slab_unlock Christoph Lameter
2010-07-09 19:07 ` [S+Q2 10/19] slub: remove dynamic dma slab allocation 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 ` [S+Q2 12/19] slub: Dynamically size kmalloc cache allocations 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 ` [S+Q2 14/19] slub: Move gfpflag masking out of the hotpath 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 ` [S+Q2 16/19] slub: Resize the new cpu queues 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 ` [S+Q2 18/19] SLUB: Remove MAX_OBJS limitation Christoph Lameter
2010-07-09 19:07 ` [S+Q2 19/19] slub: Drop allocator announcement Christoph Lameter
2010-07-10 19:56 ` [S+Q2 00/19] SLUB with queueing (V2) beats SLAB netperf TCP_RR 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-13 13:56         ` Heinz Diehl
2010-07-14  2:01           ` Christoph Lameter
2010-07-14 11:51             ` Tejun Heo
2010-07-14 14:25             ` Heinz Diehl
2010-07-14 20:22             ` David Rientjes
2010-07-14 11:46     ` Tejun Heo
2010-07-14 22:26 ` David Rientjes
2010-07-15 20:17   ` Christoph Lameter
2010-07-15 20:30     ` David Rientjes
2010-07-14 23:52 ` David Rientjes
2010-07-16  8:23   ` Pekka Enberg
2010-07-16  9:02     ` David Rientjes
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 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).