Re: Common10 [11/20] Do slab aliasing call from common code

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



2012/8/4 Christoph Lameter <cl@xxxxxxxxx>:
> The slab aliasing logic causes some strange contortions in
> slub. So add a call to deal with aliases to slab_common.c
> but disable it for other slab allocators by providng stubs
> that fail to create aliases.
>
> Full general support for aliases will require additional
> cleanup passes and more standardization of fields in
> kmem_cache.
>
> Signed-off-by: Christoph Lameter <cl@xxxxxxxxx>
>
>
> ---
>  mm/slab.h        |   10 ++++++++++
>  mm/slab_common.c |   16 +++++++---------
>  mm/slub.c        |   18 ++++++++++++------
>  3 files changed, 29 insertions(+), 15 deletions(-)
>
> Index: linux-2.6/mm/slab.h
> ===================================================================
> --- linux-2.6.orig/mm/slab.h    2012-08-02 14:21:24.841995858 -0500
> +++ linux-2.6/mm/slab.h 2012-08-02 14:23:08.071846583 -0500
> @@ -36,6 +36,16 @@
>  struct kmem_cache *__kmem_cache_create(const char *name, size_t size,
>         size_t align, unsigned long flags, void (*ctor)(void *));
>
> +#ifdef CONFIG_SLUB
> +struct kmem_cache *__kmem_cache_alias(const char *name, size_t size,
> +       size_t align, unsigned long flags, void (*ctor)(void *));
> +#else
> +static inline struct kmem_cache *__kmem_cache_alias(const char *name, size_t size,
> +       size_t align, unsigned long flags, void (*ctor)(void *))
> +{ return NULL; }
> +#endif
> +
> +
>  int __kmem_cache_shutdown(struct kmem_cache *);
>
>  #endif
> Index: linux-2.6/mm/slab_common.c
> ===================================================================
> --- linux-2.6.orig/mm/slab_common.c     2012-08-02 14:22:59.087685489 -0500
> +++ linux-2.6/mm/slab_common.c  2012-08-02 14:23:08.071846583 -0500
> @@ -94,6 +94,10 @@
>         WARN_ON(strchr(name, ' '));     /* It confuses parsers */
>  #endif
>
> +       s = __kmem_cache_alias(name, size, align, flags, ctor);
> +       if (s)
> +               goto out_locked;
> +
>         n = kstrdup(name, GFP_KERNEL);
>         if (!n) {
>                 err = -ENOMEM;z
> @@ -115,9 +119,7 @@
>                 err = -ENOSYS; /* Until __kmem_cache_create returns code */
>         }
>
> -#ifdef CONFIG_DEBUG_VM
>  out_locked:
> -#endif
>         mutex_unlock(&slab_mutex);
>         put_online_cpus();
>
> Index: linux-2.6/mm/slub.c
> ===================================================================
> --- linux-2.6.orig/mm/slub.c    2012-08-02 14:21:30.678100549 -0500
> +++ linux-2.6/mm/slub.c 2012-08-02 14:23:08.075846653 -0500
> @@ -3701,7 +3701,7 @@
>                 slub_max_order = 0;
>
>         kmem_size = offsetof(struct kmem_cache, node) +
> -                               nr_node_ids * sizeof(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());
> @@ -3915,7 +3915,7 @@
>         return NULL;
>  }
>
> -struct kmem_cache *__kmem_cache_create(const char *name, size_t size,
> +struct kmem_cache *__kmem_cache_alias(const char *name, size_t size,
>                 size_t align, unsigned long flags, void (*ctor)(void *))
>  {
>         struct kmem_cache *s;
> @@ -3932,11 +3932,18 @@
>
>                 if (sysfs_slab_alias(s, name)) {
>                         s->refcount--;
> -                       return NULL;
> +                       s = NULL;
>                 }
> -               return s;
>         }
>
> +       return s;
> +}
> +
> +struct kmem_cache *__kmem_cache_create(const char *name, size_t size,
> +               size_t align, unsigned long flags, void (*ctor)(void *))
> +{
> +       struct kmem_cache *s;
> +
>         s = kmem_cache_alloc(kmem_cache, GFP_KERNEL);
>         if (s) {
>                 if (kmem_cache_open(s, name,
>

sysfs_slab_alias() in __kmem_cache_alias() stores reference of name param.
Currently, when we call __kmem_cache_alias(), we don't do kstrdup().
It is not desired behavior as we don't want to be depend on caller of
kmem_cache_create().
So we need to do kstrdup() before invoking __kmem_cache_alias().

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@xxxxxxxxx.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@xxxxxxxxx";> email@xxxxxxxxx </a>


[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]