lkml.org 
[lkml]   [2012]   [Jun]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH SLUB 1/2 v2] duplicate the cache name in saved_alias list
    From
    Date
    SLUB duplicates the cache name string passed into kmem_cache_create().
    However if the cache could be merged to others during early boot, the
    name pointer is saved in saved_alias list, and the string needs to be
    kept valid before slab_sysfs_init() is finished. With this patch, the
    name string (if kmalloced) could be kfreed after calling
    kmem_cache_create().

    Some more details:

    kmem_cache_create() checks whether it is mergeable before creating one.
    If not mergeable, the name is duplicated: n = kstrdup(name, GFP_KERNEL);

    If it is mergeable, it calls sysfs_slab_alias(). If the sysfs is ready
    (slab_state == SYSFS), then the name is duplicated (or dropped if no
    SYSFS support) in sysfs_create_link() for use.

    For the above cases, we could safely kfree the name string after calling
    cache create.

    However, during early boot, before sysfs is ready (slab_state < SYSFS),
    the sysfs_slab_alias() saves the pointer of name in the alias_list.
    Those entries in the list are added to sysfs later in slab_sysfs_init()
    to set up the sysfs stuff, and we need keep the name string passed in
    valid until it finishes. By duplicating the name string here also, we
    are able to safely kfree the name string after calling cache create.

    v2: removed an unnecessary assignment in v1; some changes in change log,
    added more details

    Signed-off-by: Li Zhong <zhong@linux.vnet.ibm.com>
    ---
    mm/slub.c | 7 ++++++-
    1 file changed, 6 insertions(+), 1 deletion(-)

    diff --git a/mm/slub.c b/mm/slub.c
    index 8c691fa..ed9f3c5 100644
    --- a/mm/slub.c
    +++ b/mm/slub.c
    @@ -5372,7 +5372,11 @@ static int sysfs_slab_alias(struct kmem_cache *s,
    const char *name)
    return -ENOMEM;

    al->s = s;
    - al->name = name;
    + al->name = kstrdup(name, GFP_KERNEL);
    + if (!al->name) {
    + kfree(al);
    + return -ENOMEM;
    + }
    al->next = alias_list;
    alias_list = al;
    return 0;
    @@ -5409,6 +5413,7 @@ static int __init slab_sysfs_init(void)
    if (err)
    printk(KERN_ERR "SLUB: Unable to add boot slab alias"
    " %s to sysfs\n", s->name);
    + kfree(al->name);
    kfree(al);
    }

    --
    1.7.9.5



    \
     
     \ /
      Last update: 2012-06-27 10:21    [W:4.784 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site