Skip to content

Commit

Permalink
mm/slab_common.c: do not warn that cache is busy on destroy more than…
Browse files Browse the repository at this point in the history
… once

Currently, when kmem_cache_destroy() is called for a global cache, we
print a warning for each per memcg cache attached to it that has active
objects (see shutdown_cache).  This is redundant, because it gives no new
information and only clutters the log.  If a cache being destroyed has
active objects, there must be a memory leak in the module that created the
cache, and it does not matter if the cache was used by users in memory
cgroups or not.

This patch moves the warning from shutdown_cache(), which is called for
shutting down both global and per memcg caches, to kmem_cache_destroy(),
so that the warning is only printed once if there are objects left in the
cache being destroyed.

Signed-off-by: Vladimir Davydov <[email protected]>
Cc: Christoph Lameter <[email protected]>
Cc: Pekka Enberg <[email protected]>
Cc: David Rientjes <[email protected]>
Cc: Joonsoo Kim <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Vladimir Davydov authored and torvalds committed Nov 6, 2015
1 parent d60fdcc commit cd918c5
Showing 1 changed file with 7 additions and 6 deletions.
13 changes: 7 additions & 6 deletions mm/slab_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -451,12 +451,8 @@ EXPORT_SYMBOL(kmem_cache_create);
static int shutdown_cache(struct kmem_cache *s,
struct list_head *release, bool *need_rcu_barrier)
{
if (__kmem_cache_shutdown(s) != 0) {
printk(KERN_ERR "kmem_cache_destroy %s: "
"Slab cache still has objects\n", s->name);
dump_stack();
if (__kmem_cache_shutdown(s) != 0)
return -EBUSY;
}

if (s->flags & SLAB_DESTROY_BY_RCU)
*need_rcu_barrier = true;
Expand Down Expand Up @@ -722,8 +718,13 @@ void kmem_cache_destroy(struct kmem_cache *s)

err = shutdown_memcg_caches(s, &release, &need_rcu_barrier);
if (!err)
shutdown_cache(s, &release, &need_rcu_barrier);
err = shutdown_cache(s, &release, &need_rcu_barrier);

if (err) {
pr_err("kmem_cache_destroy %s: "
"Slab cache still has objects\n", s->name);
dump_stack();
}
out_unlock:
mutex_unlock(&slab_mutex);

Expand Down

0 comments on commit cd918c5

Please sign in to comment.