From: Vladimir Davydov <vdavydov@parallels.com>
To: akpm@linux-foundation.org
Cc: cl@linux.com, iamjoonsoo.kim@lge.com, rientjes@google.com,
penberg@kernel.org, hannes@cmpxchg.org, mhocko@suse.cz,
linux-kernel@vger.kernel.org, linux-mm@kvack.org
Subject: [PATCH -mm v3 0/8] memcg/slab: reintroduce dead cache self-destruction
Date: Fri, 13 Jun 2014 00:38:14 +0400 [thread overview]
Message-ID: <cover.1402602126.git.vdavydov@parallels.com> (raw)
Hi,
When a memcg is turned offline, some of its kmem caches can still have
active objects and therefore cannot be destroyed immediately. Currently,
we simply leak such caches along with the owner memcg, which is bad and
should be resolved.
It would be perfect if we could move all slab pages of such dead caches
to the root/parent cache on memcg offline. However, when I tried to
implement such re-parenting, I was pointed out by Christoph that the
overhead of this would be unacceptable, at least for SLUB (see
https://lkml.org/lkml/2014/5/13/446)
The problem with re-parenting of individual slabs is that it requires
tracking of all slabs allocated to a cache, but SLUB doesn't track full
slabs if !debug. Changing this behavior would result in significant
performance degradation of regular alloc/free paths, because it would
make alloc/free take per node list locks more often.
After pondering about this problem for some time, I think we should
return to dead caches self-destruction, i.e. scheduling cache
destruction work when the last slab page is freed.
This is the behavior we had before commit 5bd93da9917f ("memcg, slab:
simplify synchronization scheme"). The reason why it was removed was that
it simply didn't work, because SL[AU]B are implemented in such a way
that they don't discard empty slabs immediately, but prefer keeping them
cached for indefinite time to speed up further allocations.
However, we can change this w/o noticeable performance impact for both
SLAB and SLUB by making them drop free slabs as soon as they become
empty. Since dead caches should never be allocated from, removing empty
slabs from them shouldn't result in noticeable performance degradation.
So, this patch set reintroduces dead cache self-destruction and adds
some tweaks to SL[AU]B to prevent dead caches from hanging around
indefinitely. It is organized as follows:
- patches 1-3 reintroduce dead memcg cache self-destruction;
- patch 4 makes SLUB's version of kmem_cache_shrink always drop empty
slabs, even if it fails to allocate a temporary array;
- patches 5 and 6 fix possible use-after-free connected with
asynchronous cache destruction;
- patches 7 and 8 disable caching of empty slabs for dead memcg caches
for SLUB and SLAB respectively.
Note, this doesn't resolve the problem of memcgs pinned by dead kmem
caches. I'm planning to solve this by re-parenting dead kmem caches to
the parent memcg.
v3:
- add smp barrier to memcg_cache_dead (Joonsoo);
- add comment explaining why kfree has to be non-preemptable (Joonsoo);
- do not call flush_all from put_cpu_partial (SLUB), because slab_free
is now non-preemptable (Joonsoo);
- simplify the patch disabling free slabs/objects caching for dead SLAB
caches.
v2: https://lkml.org/lkml/2014/6/6/366
- fix use-after-free connected with asynchronous cache destruction;
- less intrusive version of SLUB's kmem_cache_shrink fix;
- simplify disabling of free slabs caching for SLUB (Joonsoo);
- disable free slabs caching instead of using cache_reap for SLAB
(Christoph).
v1: https://lkml.org/lkml/2014/5/30/264
Thanks,
Vladimir Davydov (8):
memcg: cleanup memcg_cache_params refcnt usage
memcg: destroy kmem caches when last slab is freed
memcg: mark caches that belong to offline memcgs as dead
slub: don't fail kmem_cache_shrink if slab placement optimization
fails
slub: make slab_free non-preemptable
memcg: wait for kfree's to finish before destroying cache
slub: make dead memcg caches discard free slabs immediately
slab: do not keep free objects/slabs on dead memcg caches
include/linux/slab.h | 14 +++++++-----
mm/memcontrol.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++----
mm/slab.c | 37 ++++++++++++++++++++++++++++++-
mm/slab.h | 25 +++++++++++++++++++++
mm/slub.c | 42 ++++++++++++++++++++++++++---------
5 files changed, 156 insertions(+), 21 deletions(-)
--
1.7.10.4
--
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 reply other threads:[~2014-06-12 20:38 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-12 20:38 Vladimir Davydov [this message]
2014-06-12 20:38 ` [PATCH -mm v3 1/8] memcg: cleanup memcg_cache_params refcnt usage Vladimir Davydov
2014-06-12 20:38 ` [PATCH -mm v3 2/8] memcg: destroy kmem caches when last slab is freed Vladimir Davydov
2014-06-12 20:38 ` [PATCH -mm v3 3/8] memcg: mark caches that belong to offline memcgs as dead Vladimir Davydov
2014-06-12 20:38 ` [PATCH -mm v3 4/8] slub: don't fail kmem_cache_shrink if slab placement optimization fails Vladimir Davydov
2014-06-12 20:38 ` [PATCH -mm v3 5/8] slub: make slab_free non-preemptable Vladimir Davydov
2014-06-12 20:38 ` [PATCH -mm v3 6/8] memcg: wait for kfree's to finish before destroying cache Vladimir Davydov
2014-06-12 20:38 ` [PATCH -mm v3 7/8] slub: make dead memcg caches discard free slabs immediately Vladimir Davydov
2014-06-13 16:54 ` Christoph Lameter
2014-06-24 7:50 ` Joonsoo Kim
2014-06-24 8:25 ` Vladimir Davydov
2014-06-24 9:42 ` [PATCH -mm] slub: kmem_cache_shrink: check if partial list is empty under list_lock Vladimir Davydov
2014-06-12 20:38 ` [PATCH -mm v3 8/8] slab: do not keep free objects/slabs on dead memcg caches Vladimir Davydov
2014-06-12 20:41 ` Vladimir Davydov
2014-06-24 7:25 ` Joonsoo Kim
2014-06-24 7:42 ` Vladimir Davydov
2014-06-24 12:28 ` [PATCH -mm] slab: set free_limit for dead caches to 0 Vladimir Davydov
2014-06-24 7:38 ` [PATCH -mm v3 8/8] slab: do not keep free objects/slabs on dead memcg caches Joonsoo Kim
2014-06-24 7:48 ` Vladimir Davydov
2014-06-25 13:45 ` Vladimir Davydov
2014-06-27 6:05 ` Joonsoo Kim
2014-06-30 15:49 ` Christoph Lameter
2014-07-01 7:46 ` Vladimir Davydov
2014-06-25 14:39 ` [PATCH] slab: document why cache can have no per cpu array on kfree Vladimir Davydov
2014-06-25 16:19 ` Christoph Lameter
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=cover.1402602126.git.vdavydov@parallels.com \
--to=vdavydov@parallels.com \
--cc=akpm@linux-foundation.org \
--cc=cl@linux.com \
--cc=hannes@cmpxchg.org \
--cc=iamjoonsoo.kim@lge.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mhocko@suse.cz \
--cc=penberg@kernel.org \
--cc=rientjes@google.com \
/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;
as well as URLs for NNTP newsgroup(s).