linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/2] do not account memory used for cache creation
@ 2013-06-09 12:45 Glauber Costa
  2013-06-09 12:45 ` [PATCH v2 1/2] memcg: also test for skip accounting at the page allocation level Glauber Costa
  2013-06-09 12:45 ` [PATCH v2 2/2] memcg: do not account memory used for cache creation Glauber Costa
  0 siblings, 2 replies; 3+ messages in thread
From: Glauber Costa @ 2013-06-09 12:45 UTC (permalink / raw)
  To: linux-mm; +Cc: akpm, mhocko, hannes, kamezawa.hiroyu, Glauber Costa

The memory we used to hold the memcg arrays is currently accounted to
the current memcg. But that creates a problem, because that memory can
only be freed after the last user is gone. Our only way to know which is
the last user, is to hook up to freeing time, but the fact that we still
have some in flight kmallocs will prevent freeing to happen. I believe
therefore to be just easier to account this memory as global overhead.

>From my last submission, Michal rightfully noted that this will break
when SLUB is used and allocations are big enough, since those will bypass
the cache mechanism and go directly to the page allocator. To fix this,
we need an extra patch that instructs the memcg kmem page charging to check
the bypass flag as well.

Glauber Costa (2):
  memcg: also test for skip accounting at the page allocation level
  memcg: do not account memory used for cache creation

 mm/memcontrol.c | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

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

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH v2 1/2] memcg: also test for skip accounting at the page allocation level
  2013-06-09 12:45 [PATCH v2 0/2] do not account memory used for cache creation Glauber Costa
@ 2013-06-09 12:45 ` Glauber Costa
  2013-06-09 12:45 ` [PATCH v2 2/2] memcg: do not account memory used for cache creation Glauber Costa
  1 sibling, 0 replies; 3+ messages in thread
From: Glauber Costa @ 2013-06-09 12:45 UTC (permalink / raw)
  To: linux-mm; +Cc: akpm, mhocko, hannes, kamezawa.hiroyu, Glauber Costa

Disabling accounting is only relevant for some specific memcg internal
allocations. Therefore we would initially not have such check at
memcg_kmem_newpage_charge, since direct calls to the page allocator that are
marked with GFP_KMEMCG only happen outside memcg core. We are mostly concerned
with cache allocations and by having this test at memcg_kmem_get_cache we are
already able to relay the allocation to the root cache and bypass the memcg
caches altogether.

There is one exception, though: the SLUB allocator does not create large order
caches, but rather service large kmallocs directly from the page allocator.
Therefore, the following sequence, when backed by the SLUB allocator:

	memcg_stop_kmem_account();
	kmalloc(<large_number>)
	memcg_resume_kmem_account();

would effectively ignore the fact that we should skip accounting,
since it will drive us directly to this function without passing
through the cache selector memcg_kmem_get_cache. Such large
allocations are extremely rare but can happen, for instance, for the
cache arrays.

This was never a problem in practice, because we weren't skipping
accounting for the cache arrays. All the allocations we were skipping
were fairly small. However, the fact that we were not skipping those
allocations are a problem and can prevent the memcgs from going away.
As we fix that, we need to make sure that the fix will also work with
the SLUB allocator.

Signed-off-by: Glauber Costa <glommer@openvz.org>
Reported-by: Michal Hocko <mhocko@suze.cz>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Kamezawa Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
---
 mm/memcontrol.c | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 5d8b93a..dbabe4d 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -3974,6 +3974,34 @@ __memcg_kmem_newpage_charge(gfp_t gfp, struct mem_cgroup **_memcg, int order)
 	int ret;
 
 	*_memcg = NULL;
+
+	/*
+	 * Disabling accounting is only relevant for some specific memcg
+	 * internal allocations. Therefore we would initially not have such
+	 * check here, since direct calls to the page allocator that are marked
+	 * with GFP_KMEMCG only happen outside memcg core. We are mostly
+	 * concerned with cache allocations, and by having this test at
+	 * memcg_kmem_get_cache, we are already able to relay the allocation to
+	 * the root cache and bypass the memcg cache altogether.
+	 *
+	 * There is one exception, though: the SLUB allocator does not create
+	 * large order caches, but rather service large kmallocs directly from
+	 * the page allocator. Therefore, the following sequence when backed by
+	 * the SLUB allocator:
+	 *
+	 * 	memcg_stop_kmem_account();
+	 * 	kmalloc(<large_number>)
+	 * 	memcg_resume_kmem_account();
+	 *
+	 * would effectively ignore the fact that we should skip accounting,
+	 * since it will drive us directly to this function without passing
+	 * through the cache selector memcg_kmem_get_cache. Such large
+	 * allocations are extremely rare but can happen, for instance, for the
+	 * cache arrays. We bring this test here.
+	 */
+	if (!current->mm || current->memcg_kmem_skip_account)
+		return true;
+
 	memcg = try_get_mem_cgroup_from_mm(current->mm);
 
 	/*
-- 
1.8.2.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>

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH v2 2/2] memcg: do not account memory used for cache creation
  2013-06-09 12:45 [PATCH v2 0/2] do not account memory used for cache creation Glauber Costa
  2013-06-09 12:45 ` [PATCH v2 1/2] memcg: also test for skip accounting at the page allocation level Glauber Costa
@ 2013-06-09 12:45 ` Glauber Costa
  1 sibling, 0 replies; 3+ messages in thread
From: Glauber Costa @ 2013-06-09 12:45 UTC (permalink / raw)
  To: linux-mm; +Cc: akpm, mhocko, hannes, kamezawa.hiroyu, Glauber Costa,
	Michal Hocko

The memory we used to hold the memcg arrays is currently accounted to
the current memcg. But that creates a problem, because that memory can
only be freed after the last user is gone. Our only way to know which is
the last user, is to hook up to freeing time, but the fact that we still
have some in flight kmallocs will prevent freeing to happen. I believe
therefore to be just easier to account this memory as global overhead.

Signed-off-by: Glauber Costa <glommer@openvz.org>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Michal Hocko <mhocko@suse.cz>
Cc: Kamezawa Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
---
 mm/memcontrol.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index dbabe4d..e3fd671 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -5670,7 +5670,9 @@ static int memcg_propagate_kmem(struct mem_cgroup *memcg)
 	static_key_slow_inc(&memcg_kmem_enabled_key);
 
 	mutex_lock(&set_limit_mutex);
+	memcg_stop_kmem_account();
 	ret = memcg_update_cache_sizes(memcg);
+	memcg_resume_kmem_account();
 	mutex_unlock(&set_limit_mutex);
 out:
 	return ret;
-- 
1.8.2.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>

^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2013-06-09 12:46 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-06-09 12:45 [PATCH v2 0/2] do not account memory used for cache creation Glauber Costa
2013-06-09 12:45 ` [PATCH v2 1/2] memcg: also test for skip accounting at the page allocation level Glauber Costa
2013-06-09 12:45 ` [PATCH v2 2/2] memcg: do not account memory used for cache creation Glauber Costa

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