linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: js1304@gmail.com
To: Andrew Morton <akpm@linux-foundation.org>
Cc: Christoph Lameter <cl@linux.com>,
	Pekka Enberg <penberg@kernel.org>,
	David Rientjes <rientjes@google.com>,
	Jesper Dangaard Brouer <brouer@redhat.com>,
	linux-mm@kvack.org, linux-kernel@vger.kernel.org,
	Joonsoo Kim <iamjoonsoo.kim@lge.com>
Subject: [PATCH 01/11] mm/slab: hold a slab_mutex when calling __kmem_cache_shrink()
Date: Mon, 28 Mar 2016 14:26:51 +0900	[thread overview]
Message-ID: <1459142821-20303-2-git-send-email-iamjoonsoo.kim@lge.com> (raw)
In-Reply-To: <1459142821-20303-1-git-send-email-iamjoonsoo.kim@lge.com>

From: Joonsoo Kim <iamjoonsoo.kim@lge.com>

Major kmem_cache metadata in slab subsystem is synchronized with
the slab_mutex. In SLAB, if some of them is changed, node's shared
array cache would be freed and re-populated. If __kmem_cache_shrink()
is called at the same time, it will call drain_array() with n->shared
without holding node lock so problem can happen.

We can fix this small theoretical race condition by holding node lock
in drain_array(), but, holding a slab_mutex in kmem_cache_shrink()
looks more appropriate solution because stable state would make things
less error-prone and this is not performance critical path.

In addtion, annotate on SLAB functions.

Signed-off-by: Joonsoo Kim <iamjoonsoo.kim@lge.com>
---
 mm/slab.c        | 2 ++
 mm/slab_common.c | 4 ++++
 2 files changed, 6 insertions(+)

diff --git a/mm/slab.c b/mm/slab.c
index a53a0f6..043606a 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -2218,6 +2218,7 @@ static void do_drain(void *arg)
 	ac->avail = 0;
 }
 
+/* Should be called with slab_mutex to prevent from freeing shared array */
 static void drain_cpu_caches(struct kmem_cache *cachep)
 {
 	struct kmem_cache_node *n;
@@ -3871,6 +3872,7 @@ skip_setup:
  * Drain an array if it contains any elements taking the node lock only if
  * necessary. Note that the node listlock also protects the array_cache
  * if drain_array() is used on the shared array.
+ * Should be called with slab_mutex to prevent from freeing shared array.
  */
 static void drain_array(struct kmem_cache *cachep, struct kmem_cache_node *n,
 			 struct array_cache *ac, int force, int node)
diff --git a/mm/slab_common.c b/mm/slab_common.c
index a65dad7..5bed565 100644
--- a/mm/slab_common.c
+++ b/mm/slab_common.c
@@ -755,7 +755,11 @@ int kmem_cache_shrink(struct kmem_cache *cachep)
 	get_online_cpus();
 	get_online_mems();
 	kasan_cache_shrink(cachep);
+
+	mutex_lock(&slab_mutex);
 	ret = __kmem_cache_shrink(cachep, false);
+	mutex_unlock(&slab_mutex);
+
 	put_online_mems();
 	put_online_cpus();
 	return ret;
-- 
1.9.1

--
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>

  reply	other threads:[~2016-03-28  5:27 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-03-28  5:26 mm/slab: reduce lock contention in alloc path js1304
2016-03-28  5:26 ` js1304 [this message]
2016-03-29  0:50   ` [PATCH 01/11] mm/slab: hold a slab_mutex when calling __kmem_cache_shrink() Christoph Lameter
2016-03-30  8:11     ` Joonsoo Kim
2016-03-31 10:53   ` Nikolay Borisov
2016-04-01  2:18     ` Joonsoo Kim
2016-03-28  5:26 ` [PATCH 02/11] mm/slab: remove BAD_ALIEN_MAGIC again js1304
2016-03-28  8:58   ` Geert Uytterhoeven
2016-03-30  8:11     ` Joonsoo Kim
2016-03-28 21:19   ` Andrew Morton
2016-03-29  0:53     ` Christoph Lameter
2016-03-28  5:26 ` [PATCH 03/11] mm/slab: drain the free slab as much as possible js1304
2016-03-29  0:54   ` Christoph Lameter
2016-03-28  5:26 ` [PATCH 04/11] mm/slab: factor out kmem_cache_node initialization code js1304
2016-03-29  0:56   ` Christoph Lameter
2016-03-30  8:12     ` Joonsoo Kim
2016-03-28  5:26 ` [PATCH 05/11] mm/slab: clean-up kmem_cache_node setup js1304
2016-03-29  0:58   ` Christoph Lameter
2016-03-30  8:15     ` Joonsoo Kim
2016-03-28  5:26 ` [PATCH 06/11] mm/slab: don't keep free slabs if free_objects exceeds free_limit js1304
2016-03-29  1:03   ` Christoph Lameter
2016-03-30  8:25     ` Joonsoo Kim
2016-03-28  5:26 ` [PATCH 07/11] mm/slab: racy access/modify the slab color js1304
2016-03-29  1:05   ` Christoph Lameter
2016-03-30  8:25     ` Joonsoo Kim
2016-03-28  5:26 ` [PATCH 08/11] mm/slab: make cache_grow() handle the page allocated on arbitrary node js1304
2016-03-28  5:26 ` [PATCH 09/11] mm/slab: separate cache_grow() to two parts js1304
2016-03-28  5:27 ` [PATCH 10/11] mm/slab: refill cpu cache through a new slab without holding a node lock js1304
2016-03-28  5:27 ` [PATCH 11/11] mm/slab: lockless decision to grow cache js1304

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=1459142821-20303-2-git-send-email-iamjoonsoo.kim@lge.com \
    --to=js1304@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=brouer@redhat.com \
    --cc=cl@linux.com \
    --cc=iamjoonsoo.kim@lge.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --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