Skip to content

Commit

Permalink
slub: extend slub debug to handle multiple slabs
Browse files Browse the repository at this point in the history
Extend the slub_debug syntax to "slub_debug=<flags>[,<slub>]*", where
<slub> may contain an asterisk at the end.  For example, the following
would poison all kmalloc slabs:

	slub_debug=P,kmalloc*

and the following would apply the default flags to all kmalloc and all
block IO slabs:

	slub_debug=,bio*,kmalloc*

Please note that a similar patch was posted by Iliyan Malchev some time
ago but was never merged:

	https://marc.info/?l=linux-mm&m=131283905330474&w=2

Link: http://lkml.kernel.org/r/20180928111139.27962-1-atomlin@redhat.com
Signed-off-by: Aaron Tomlin <atomlin@redhat.com>
Acked-by: Christoph Lameter <cl@linux.com>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: David Rientjes <rientjes@google.com>
Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Cc: Iliyan Malchev <malchev@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Aaron Tomlin authored and torvalds committed Oct 26, 2018
1 parent 6144847 commit c5fd3ca
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 9 deletions.
12 changes: 9 additions & 3 deletions Documentation/vm/slub.rst
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,10 @@ debugging is enabled. Format:

slub_debug=<Debug-Options>
Enable options for all slabs
slub_debug=<Debug-Options>,<slab name>
Enable options only for select slabs

slub_debug=<Debug-Options>,<slab name1>,<slab name2>,...
Enable options only for select slabs (no spaces
after a comma)

Possible debug options are::

Expand All @@ -62,7 +63,12 @@ Trying to find an issue in the dentry cache? Try::

slub_debug=,dentry

to only enable debugging on the dentry cache.
to only enable debugging on the dentry cache. You may use an asterisk at the
end of the slab name, in order to cover all slabs with the same prefix. For
example, here's how you can poison the dentry cache as well as all kmalloc
slabs:

slub_debug=P,kmalloc-*,dentry
Red zoning and tracking may realign the slab. We can just apply sanity checks
to the dentry cache with::
Expand Down
50 changes: 44 additions & 6 deletions mm/slub.c
Original file line number Diff line number Diff line change
Expand Up @@ -1276,16 +1276,54 @@ static int __init setup_slub_debug(char *str)

__setup("slub_debug", setup_slub_debug);

/*
* kmem_cache_flags - apply debugging options to the cache
* @object_size: the size of an object without meta data
* @flags: flags to set
* @name: name of the cache
* @ctor: constructor function
*
* Debug option(s) are applied to @flags. In addition to the debug
* option(s), if a slab name (or multiple) is specified i.e.
* slub_debug=<Debug-Options>,<slab name1>,<slab name2> ...
* then only the select slabs will receive the debug option(s).
*/
slab_flags_t kmem_cache_flags(unsigned int object_size,
slab_flags_t flags, const char *name,
void (*ctor)(void *))
{
/*
* Enable debugging if selected on the kernel commandline.
*/
if (slub_debug && (!slub_debug_slabs || (name &&
!strncmp(slub_debug_slabs, name, strlen(slub_debug_slabs)))))
flags |= slub_debug;
char *iter;
size_t len;

/* If slub_debug = 0, it folds into the if conditional. */
if (!slub_debug_slabs)
return flags | slub_debug;

len = strlen(name);
iter = slub_debug_slabs;
while (*iter) {
char *end, *glob;
size_t cmplen;

end = strchr(iter, ',');
if (!end)
end = iter + strlen(iter);

glob = strnchr(iter, end - iter, '*');
if (glob)
cmplen = glob - iter;
else
cmplen = max_t(size_t, len, (end - iter));

if (!strncmp(name, iter, cmplen)) {
flags |= slub_debug;
break;
}

if (!*end)
break;
iter = end + 1;
}

return flags;
}
Expand Down

0 comments on commit c5fd3ca

Please sign in to comment.