SLUB duplicates the cache name in kmem_cache_create(). However if the
cache could be merged to others during early booting, the name pointer
is saved in saved_alias list, and the string needs to be kept valid
before slab_sysfs_init() is called.
This patch tries to duplicate the cache name in saved_alias list, so
that the cache name could be safely kfreed after calling
kmem_cache_create(), if that name is kmalloced.
Signed-off-by: Li Zhong <redacted>
---
mm/slub.c | 6 ++++++
1 files changed, 6 insertions(+), 0 deletions(-)
This patch tries to kfree the cache name of pgtables cache if SLUB is
used, as SLUB duplicates the cache name, and the original one is leaked.
This patch depends on patch 1 -- (duplicate the cache name in
saved_alias list) in this mail thread. As the pgtables cache might be
merged to other caches. In this case, the name could be safely kfreed
after calling kmem_cache_create() with patch 1.
Signed-off-by: Li Zhong <redacted>
---
arch/powerpc/mm/init_64.c | 3 +++
1 files changed, 3 insertions(+), 0 deletions(-)
SLUB duplicates the cache name in kmem_cache_create(). However if the
cache could be merged to others during early booting, the name pointer
is saved in saved_alias list, and the string needs to be kept valid
before slab_sysfs_init() is called.
This patch tries to duplicate the cache name in saved_alias list, so
that the cache name could be safely kfreed after calling
kmem_cache_create(), if that name is kmalloced.
Signed-off-by: Li Zhong <redacted>
---
mm/slub.c | 6 ++++++
1 files changed, 6 insertions(+), 0 deletions(-)
From: Glauber Costa <hidden> Date: 2012-06-25 11:13:43
On 06/25/2012 01:53 PM, Li Zhong wrote:
quoted hunk
SLUB duplicates the cache name in kmem_cache_create(). However if the
cache could be merged to others during early booting, the name pointer
is saved in saved_alias list, and the string needs to be kept valid
before slab_sysfs_init() is called.
This patch tries to duplicate the cache name in saved_alias list, so
that the cache name could be safely kfreed after calling
kmem_cache_create(), if that name is kmalloced.
Signed-off-by: Li Zhong <redacted>
---
mm/slub.c | 6 ++++++
1 files changed, 6 insertions(+), 0 deletions(-)
@@ -5409,6 +5414,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); }
What's unsafe about the current state of affairs ?
Whenever we alias, we'll increase the reference counter.
kmem_cache_destroy will only actually destroy the structure whenever that refcnt reaches zero.
This means that kfree shouldn't happen until then. So what is exactly that you are seeing?
Now, if you ask me, keeping the name around in user-visible files like /proc/slabinfo for caches that are removed already can be a bit confusing (that is because we don't add aliases to the slab_cache list)
If you want to touch this, one thing you can do is to keep a list of names bundled in an alias. If an alias is removed, you free that name. If that name is the representative name of the bundle, you move to the next one.
On Mon, 2012-06-25 at 18:54 +0800, Wanlong Gao wrote:
On 06/25/2012 05:53 PM, Li Zhong wrote:
quoted
SLUB duplicates the cache name in kmem_cache_create(). However if the
cache could be merged to others during early booting, the name pointer
is saved in saved_alias list, and the string needs to be kept valid
before slab_sysfs_init() is called.
This patch tries to duplicate the cache name in saved_alias list, so
that the cache name could be safely kfreed after calling
kmem_cache_create(), if that name is kmalloced.
Signed-off-by: Li Zhong <redacted>
---
mm/slub.c | 6 ++++++
1 files changed, 6 insertions(+), 0 deletions(-)
On Mon, 2012-06-25 at 15:10 +0400, Glauber Costa wrote:
On 06/25/2012 01:53 PM, Li Zhong wrote:
quoted
SLUB duplicates the cache name in kmem_cache_create(). However if the
cache could be merged to others during early booting, the name pointer
is saved in saved_alias list, and the string needs to be kept valid
before slab_sysfs_init() is called.
This patch tries to duplicate the cache name in saved_alias list, so
that the cache name could be safely kfreed after calling
kmem_cache_create(), if that name is kmalloced.
Signed-off-by: Li Zhong <redacted>
---
mm/slub.c | 6 ++++++
1 files changed, 6 insertions(+), 0 deletions(-)
@@ -5409,6 +5414,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); }
What's unsafe about the current state of affairs ?
Whenever we alias, we'll increase the reference counter.
kmem_cache_destroy will only actually destroy the structure whenever
that refcnt reaches zero.
This means that kfree shouldn't happen until then. So what is exactly
that you are seeing?
Maybe I didn't describe it clearly ... It is only about the name string
passed into kmem_cache_create() during early boot.
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. And those entries in the list are added to sysfs later after
slab_sysfs_init() is called. So we need to keep the name string valid
until slab_sysfs_init() is called to set up the sysfs stuff. By
duplicating the name string here also, we are able to kfree the name
string after calling the cache create.
Now, if you ask me, keeping the name around in user-visible files like
/proc/slabinfo for caches that are removed already can be a bit
confusing (that is because we don't add aliases to the slab_cache list)
If you want to touch this, one thing you can do is to keep a list of
names bundled in an alias. If an alias is removed, you free that name.
If that name is the representative name of the bundle, you move to the
next one.
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 <redacted>
---
mm/slub.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
(*ctor)(void *))
align = max_t(unsigned long, align, minalign);
name = kasprintf(GFP_KERNEL, "pgtable-2^%d", shift);
new = kmem_cache_create(name, table_size, align, 0, ctor);
+#ifdef CONFIG_SLUB
+ kfree(name); /* SLUB duplicates the cache name */
+#endif
PGT_CACHE(shift) = new;
pr_debug("Allocated pgtable cache for order %d\n", shift);
This is very gross ... and fragile. Also the subtle difference in
semantics between SLUB and SLAB is a VERY BAD IDEA.
I reckon you should make the other allocators all copy the name
instead.
Ben.
From: Christoph Lameter <hidden> Date: 2012-07-03 20:36:59
Looking through the emails it seems that there is an issue with alias
strings. That can be solved by duping the name of the slab earlier in kmem_cache_create().
Does this patch fix the issue?
Subject: slub: Dup name earlier in kmem_cache_create
Dup the name earlier in kmem_cache_create so that alias
processing is done using the copy of the string and not
the string itself.
Signed-off-by: Christoph Lameter <redacted>
---
mm/slub.c | 29 ++++++++++++++---------------
1 file changed, 14 insertions(+), 15 deletions(-)
Index: linux-2.6/mm/slub.c
===================================================================
On Tue, 2012-07-03 at 15:36 -0500, Christoph Lameter wrote:
Looking through the emails it seems that there is an issue with alias
strings.
To be more precise, there seems no big issue currently. I just wanted to
make following usage of kmem_cache_create (SLUB) possible:
name = some string kmalloced
kmem_cache_create(name, ...)
kfree(name);
And from my understanding of the code, the saved_alias list, which is
used to keep track of the alias entries during early boot (slab_state <
SYSFS), is a blocker. It needs the name string to be valid until
slab_sysfs_init() is finished.
That can be solved by duping the name of the slab earlier in kmem_cache_create().
Does this patch fix the issue?
I'm afraid not...
With the patch below, we still need to kfree the duplicated name in
slab_sysfs_init().
And I think it would be easier to understand if we duplicate the name
string when creating one entry for saved_alias list, and kfree it when
we remove one entry from saved_alias list.
I'm not sure whether you got the patch #1 of the two I sent previously.
If not, would you kindly spend some time reviewing it to see if I missed
anything? Link below for your convenience:
https://lkml.org/lkml/2012/6/27/83
Btw, as Ben suggested, I'm now working on duplicating the name string in
SLAB to make them consistent, so we don't need the #ifdef CONFIG_SLUB
any more. Will send it out for your review after it is finished.
quoted hunk
Subject: slub: Dup name earlier in kmem_cache_create
Dup the name earlier in kmem_cache_create so that alias
processing is done using the copy of the string and not
the string itself.
Signed-off-by: Christoph Lameter <redacted>
---
mm/slub.c | 29 ++++++++++++++---------------
1 file changed, 14 insertions(+), 15 deletions(-)
Index: linux-2.6/mm/slub.c
===================================================================
From: Glauber Costa <hidden> Date: 2012-07-04 12:43:42
On 07/04/2012 01:00 PM, Li Zhong wrote:
On Tue, 2012-07-03 at 15:36 -0500, Christoph Lameter wrote:
quoted
quoted
Looking through the emails it seems that there is an issue with alias
strings.
To be more precise, there seems no big issue currently. I just wanted to
make following usage of kmem_cache_create (SLUB) possible:
name = some string kmalloced
kmem_cache_create(name, ...)
kfree(name);
Out of curiosity: Why?
This is not (currently) possible with the other allocators (may change
with christoph's unification patches), so you would be making your code
slub-dependent.
On Wed, 2012-07-04 at 16:40 +0400, Glauber Costa wrote:
On 07/04/2012 01:00 PM, Li Zhong wrote:
quoted
On Tue, 2012-07-03 at 15:36 -0500, Christoph Lameter wrote:
quoted
quoted
Looking through the emails it seems that there is an issue with alias
strings.
To be more precise, there seems no big issue currently. I just wanted to
make following usage of kmem_cache_create (SLUB) possible:
name = some string kmalloced
kmem_cache_create(name, ...)
kfree(name);
Out of curiosity: Why?
This is not (currently) possible with the other allocators (may change
with christoph's unification patches), so you would be making your code
slub-dependent.
For slub itself, I think it's not good that: in some cases, the name
string could be kfreed ( if it was kmalloced ) immediately after calling
the cache create; in some other case, the name string needs to be kept
valid until some init calls finished.
I agree with you that it would make the code slub-dependent, so I'm now
working on the consistency of the other allocators regarding this name
string duplicating thing.
From: Glauber Costa <hidden> Date: 2012-07-05 08:26:44
On 07/05/2012 05:41 AM, Li Zhong wrote:
On Wed, 2012-07-04 at 16:40 +0400, Glauber Costa wrote:
quoted
On 07/04/2012 01:00 PM, Li Zhong wrote:
quoted
On Tue, 2012-07-03 at 15:36 -0500, Christoph Lameter wrote:
quoted
quoted
Looking through the emails it seems that there is an issue with alias
strings.
To be more precise, there seems no big issue currently. I just wanted to
make following usage of kmem_cache_create (SLUB) possible:
name = some string kmalloced
kmem_cache_create(name, ...)
kfree(name);
Out of curiosity: Why?
This is not (currently) possible with the other allocators (may change
with christoph's unification patches), so you would be making your code
slub-dependent.
For slub itself, I think it's not good that: in some cases, the name
string could be kfreed ( if it was kmalloced ) immediately after calling
the cache create; in some other case, the name string needs to be kept
valid until some init calls finished.
I agree with you that it would make the code slub-dependent, so I'm now
working on the consistency of the other allocators regarding this name
string duplicating thing.
If you really need to kfree the string, or even if it is easier for you
this way, it can be done. As a matter of fact, this is the case for me.
Just that your patch is not enough. Christoph has a patch that makes
this behavior consistent over all allocators.
This just needs to be pushed again to the tree.
On Thu, 2012-07-05 at 12:23 +0400, Glauber Costa wrote:
On 07/05/2012 05:41 AM, Li Zhong wrote:
quoted
On Wed, 2012-07-04 at 16:40 +0400, Glauber Costa wrote:
quoted
On 07/04/2012 01:00 PM, Li Zhong wrote:
quoted
On Tue, 2012-07-03 at 15:36 -0500, Christoph Lameter wrote:
quoted
quoted
Looking through the emails it seems that there is an issue with alias
strings.
To be more precise, there seems no big issue currently. I just wanted to
make following usage of kmem_cache_create (SLUB) possible:
name = some string kmalloced
kmem_cache_create(name, ...)
kfree(name);
Out of curiosity: Why?
This is not (currently) possible with the other allocators (may change
with christoph's unification patches), so you would be making your code
slub-dependent.
For slub itself, I think it's not good that: in some cases, the name
string could be kfreed ( if it was kmalloced ) immediately after calling
the cache create; in some other case, the name string needs to be kept
valid until some init calls finished.
I agree with you that it would make the code slub-dependent, so I'm now
working on the consistency of the other allocators regarding this name
string duplicating thing.
If you really need to kfree the string, or even if it is easier for you
this way, it can be done. As a matter of fact, this is the case for me.
Just that your patch is not enough. Christoph has a patch that makes
this behavior consistent over all allocators.
Sorry, I didn't know that. Seems I don't need to continue the half-done
work in slab. If possible, would you please give me a link of the patch?
Thank you.
From: Glauber Costa <hidden> Date: 2012-07-06 10:16:06
On 07/05/2012 01:29 PM, Li Zhong wrote:
On Thu, 2012-07-05 at 12:23 +0400, Glauber Costa wrote:
quoted
On 07/05/2012 05:41 AM, Li Zhong wrote:
quoted
On Wed, 2012-07-04 at 16:40 +0400, Glauber Costa wrote:
quoted
On 07/04/2012 01:00 PM, Li Zhong wrote:
quoted
On Tue, 2012-07-03 at 15:36 -0500, Christoph Lameter wrote:
quoted
quoted
Looking through the emails it seems that there is an issue with alias
strings.
To be more precise, there seems no big issue currently. I just wanted to
make following usage of kmem_cache_create (SLUB) possible:
name = some string kmalloced
kmem_cache_create(name, ...)
kfree(name);
Out of curiosity: Why?
This is not (currently) possible with the other allocators (may change
with christoph's unification patches), so you would be making your code
slub-dependent.
For slub itself, I think it's not good that: in some cases, the name
string could be kfreed ( if it was kmalloced ) immediately after calling
the cache create; in some other case, the name string needs to be kept
valid until some init calls finished.
I agree with you that it would make the code slub-dependent, so I'm now
working on the consistency of the other allocators regarding this name
string duplicating thing.
If you really need to kfree the string, or even if it is easier for you
this way, it can be done. As a matter of fact, this is the case for me.
Just that your patch is not enough. Christoph has a patch that makes
this behavior consistent over all allocators.
Sorry, I didn't know that. Seems I don't need to continue the half-done
work in slab. If possible, would you please give me a link of the patch?
Thank you.
Sorry for the delay. In case you haven't found it out yourself yet:
http://www.spinics.net/lists/linux-mm/msg36149.html
Please not this posted patch as is has a bug.
I do believe that your take on the aliasing code adds value to it. But
as I've already said once, might have to dig a bit deeper in that to get
to end of the rabbit hole.
On Fri, 2012-07-06 at 14:13 +0400, Glauber Costa wrote:
On 07/05/2012 01:29 PM, Li Zhong wrote:
quoted
On Thu, 2012-07-05 at 12:23 +0400, Glauber Costa wrote:
quoted
On 07/05/2012 05:41 AM, Li Zhong wrote:
quoted
On Wed, 2012-07-04 at 16:40 +0400, Glauber Costa wrote:
quoted
On 07/04/2012 01:00 PM, Li Zhong wrote:
quoted
On Tue, 2012-07-03 at 15:36 -0500, Christoph Lameter wrote:
quoted
quoted
Looking through the emails it seems that there is an issue with alias
strings.
To be more precise, there seems no big issue currently. I just wanted to
make following usage of kmem_cache_create (SLUB) possible:
name = some string kmalloced
kmem_cache_create(name, ...)
kfree(name);
Out of curiosity: Why?
This is not (currently) possible with the other allocators (may change
with christoph's unification patches), so you would be making your code
slub-dependent.
For slub itself, I think it's not good that: in some cases, the name
string could be kfreed ( if it was kmalloced ) immediately after calling
the cache create; in some other case, the name string needs to be kept
valid until some init calls finished.
I agree with you that it would make the code slub-dependent, so I'm now
working on the consistency of the other allocators regarding this name
string duplicating thing.
If you really need to kfree the string, or even if it is easier for you
this way, it can be done. As a matter of fact, this is the case for me.
Just that your patch is not enough. Christoph has a patch that makes
this behavior consistent over all allocators.
Sorry, I didn't know that. Seems I don't need to continue the half-done
work in slab. If possible, would you please give me a link of the patch?
Thank you.
Thank you. I think it is better to have these things in the
slab_common.c.
Please not this posted patch as is has a bug.
I do believe that your take on the aliasing code adds value to it. But
as I've already said once, might have to dig a bit deeper in that to get
to end of the rabbit hole.
With slab_common, I think my slab/slob modifications are not needed any
more. After I understand the common patches, I will check whether the
aliasing problem in slub still exists, and if yes, try to send a patch
based on that.