From: Andrew Morton <akpm@linux-foundation.org>
To: clameter@sgi.com
Cc: linux-mm@kvack.org
Subject: Re: [patch 02/10] SLUB: Fix sysfs directory handling
Date: Thu, 26 Apr 2007 23:31:38 -0700 [thread overview]
Message-ID: <20070426233138.5c6707b7.akpm@linux-foundation.org> (raw)
In-Reply-To: <20070427042907.759384015@sgi.com>
On Thu, 26 Apr 2007 21:26:57 -0700 clameter@sgi.com wrote:
> This fixes the problem that SLUB does not track the names of aliased
> slabs by changing the way that SLUB manages the files in /sys/slab.
>
> If the slab that is being operated on is not mergeable (usually the
> case if we are debugging) then do not create any aliases. If an alias
> exists that we conflict with then remove it before creating the
> directory for the unmergeable slab. If there is a true slab cache there
> and not an alias then we fail since there is a true duplication of
> slab cache names. So debugging allows the detection of slab name
> duplication as usual.
>
> If the slab is mergeable then we create a directory with a unique name
> created from the slab size, slab options and the pointer to the kmem_cache
> structure (disambiguation). All names referring to the slabs will
> then be created as symlinks to that unique name. These symlinks are
> not going to be removed on kmem_cache_destroy() since we only carry
> a counter for the number of aliases. If a new symlink is created
> then it may just replace an existing one. This means that one can create
> a gazillion slabs with the same name (if they all refer to mergeable
> caches). It will only increase the alias count. So we have the potential
> of not detecting duplicate slab names (there is actually no harm
> done by doing that....). We will detect the duplications as
> as soon as debugging is enabled because we will then no longer
> generate symlinks and special unique names.
>
> Signed-off-by: Christoph Lameter <clameter@sgi.com>
>
> Index: linux-2.6.21-rc7-mm2/mm/slub.c
> ===================================================================
> --- linux-2.6.21-rc7-mm2.orig/mm/slub.c 2007-04-26 11:40:52.000000000 -0700
> +++ linux-2.6.21-rc7-mm2/mm/slub.c 2007-04-26 11:40:59.000000000 -0700
> @@ -3298,16 +3298,68 @@ static struct kset_uevent_ops slab_ueven
>
> decl_subsys(slab, &slab_ktype, &slab_uevent_ops);
>
> +#define ID_STR_LENGTH 64
> +
> +/* Create a unique string id for a slab cache:
> + * format
> + * :[flags-]size:[memory address of kmemcache]
> + */
Exposing kernel addresses to unprivileged userspace is considered poor
form.
And it'd be (a bit) nice to have something which is consistent across
boots, I guess.
> +static char *create_unique_id(struct kmem_cache *s)
> +{
> + char *name = kmalloc(ID_STR_LENGTH, GFP_KERNEL);
> + char *p = name;
> +
> + BUG_ON(!name);
> +
> + *p++ = ':';
> + /*
> + * First flags affecting slabcache operations */
> + if (s->flags & SLAB_CACHE_DMA)
> + *p++ = 'd';
> + if (s->flags & SLAB_RECLAIM_ACCOUNT)
> + *p++ = 'a';
> + if (s->flags & SLAB_DESTROY_BY_RCU)
> + *p++ = 'r';\
> + /* Debug flags */
> + if (s->flags & SLAB_RED_ZONE)
> + *p++ = 'Z';
> + if (s->flags & SLAB_POISON)
> + *p++ = 'P';
> + if (s->flags & SLAB_STORE_USER)
> + *p++ = 'U';
> + if (p != name + 1)
> + *p++ = '-';
> + p += sprintf(p,"%07d:0x%p" ,s->size, s);
whitespace
> + BUG_ON(p > name + ID_STR_LENGTH - 1);
> + return name;
> +}
> +
> static int sysfs_slab_add(struct kmem_cache *s)
> {
> int err;
> + const char *name;
>
> if (slab_state < SYSFS)
> /* Defer until later */
> return 0;
>
> + if (s->flags & SLUB_NEVER_MERGE) {
> + /*
> + * Slabcache can never be merged so we can use the name proper.
> + * This is typically the case for debug situations. In that
> + * case we can catch duplicate names easily.
> + */
> + sysfs_remove_link(&slab_subsys.kset.kobj, s->name);
> + name = s->name;
> + } else
> + /*
> + * Create a unique name for the slab as a target
> + * for the symlinks.
> + */
> + name = create_unique_id(s);
> +
Please use braces around the second leg here. It just looks weird.
> kobj_set_kset_s(s, slab_subsys);
> - kobject_set_name(&s->kobj, s->name);
> + kobject_set_name(&s->kobj, name);
> kobject_init(&s->kobj);
> err = kobject_add(&s->kobj);
> if (err)
> @@ -3317,6 +3369,10 @@ static int sysfs_slab_add(struct kmem_ca
> if (err)
> return err;
> kobject_uevent(&s->kobj, KOBJ_ADD);
> + if (!(s->flags & SLUB_NEVER_MERGE)) {
> + sysfs_slab_alias(s, s->name);
> + kfree(name);
> + }
> return 0;
> }
>
> @@ -3342,9 +3398,14 @@ static int sysfs_slab_alias(struct kmem_
> {
> struct saved_alias *al;
>
> - if (slab_state == SYSFS)
> + if (slab_state == SYSFS) {
> + /*
> + * If we have a leftover link then remove it.
> + */
> + sysfs_remove_link(&slab_subsys.kset.kobj, name);
> return sysfs_create_link(&slab_subsys.kset.kobj,
> &s->kobj, name);
> + }
>
> al = kmalloc(sizeof(struct saved_alias), GFP_KERNEL);
> if (!al)
>
--
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:[~2007-04-27 6:31 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-04-27 4:26 [patch 00/10] SLUB patches against 2.6.21-rc7-mm2 clameter
2007-04-27 4:26 ` [patch 01/10] SLUB: Remove duplicate VM_BUG_ON clameter
2007-04-27 4:26 ` [patch 02/10] SLUB: Fix sysfs directory handling clameter
2007-04-27 6:31 ` Andrew Morton [this message]
2007-04-27 7:02 ` Christoph Lameter
2007-04-27 7:10 ` Andrew Morton
2007-04-27 4:26 ` [patch 03/10] SLUB: debug printk cleanup clameter
2007-04-27 6:32 ` Andrew Morton
2007-04-27 4:26 ` [patch 04/10] SLUB: Conform more to SLABs SLAB_HWCACHE_ALIGN behavior clameter
2007-04-27 4:27 ` [patch 05/10] SLUB: Add MIN_PARTIAL clameter
2007-04-27 4:27 ` [patch 06/10] SLUB: Free slabs and sort partial slab lists in kmem_cache_shrink clameter
2007-04-27 4:27 ` [patch 07/10] SLUB: Major slabinfo update clameter
2007-04-27 4:27 ` [patch 08/10] SLUB: Reduce the order of allocations to avoid fragmentation clameter
2007-04-27 4:27 ` [patch 09/10] SLUB: Exploit page mobility to increase allocation order clameter
2007-04-27 6:32 ` Andrew Morton
2007-04-27 7:04 ` Christoph Lameter
2007-04-27 11:14 ` Mel Gorman
2007-04-27 17:15 ` Christoph Lameter
2007-04-27 4:27 ` [patch 10/10] SLUB: i386 support clameter
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=20070426233138.5c6707b7.akpm@linux-foundation.org \
--to=akpm@linux-foundation.org \
--cc=clameter@sgi.com \
--cc=linux-mm@kvack.org \
/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