From: Li Zefan <lizefan-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
To: Andrew Morton <akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>
Cc: Tejun Heo <tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
Glauber Costa <glommer-bzQdu9zFT3WakBO8gow8eQ@public.gmane.org>,
KAMEZAWA Hiroyuki
<kamezawa.hiroyu-+CUm20s59erQFUHtdCDX3A@public.gmane.org>,
Johannes Weiner <hannes-druUgvl0LCNAfugRpC6u6w@public.gmane.org>,
LKML <linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
Cgroups <cgroups-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
linux-mm-Bw31MaZKKs3YtjvyW6yDsg@public.gmane.org,
Hugh Dickins <hughd-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
Subject: [PATCH 12/12] memcg: don't need to free memcg via RCU or workqueue
Date: Mon, 8 Apr 2013 14:36:32 +0800 [thread overview]
Message-ID: <51626570.8000400@huawei.com> (raw)
In-Reply-To: <5162648B.9070802-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
Now memcg has the same life cycle with its corresponding cgroup, and
a cgroup is freed via RCU and then mem_cgroup_css_free() is called
in a work function, so we can simply call __mem_cgroup_free() in
mem_cgroup_css_free().
This actually reverts 59927fb984de1703c67bc640c3e522d8b5276c73
("memcg: free mem_cgroup by RCU to fix oops").
Cc: Hugh Dickins <hughd-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
Signed-off-by: Li Zefan <lizefan-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
---
mm/memcontrol.c | 51 +++++----------------------------------------------
1 file changed, 5 insertions(+), 46 deletions(-)
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index a6d44bc..5aa6e91 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -261,28 +261,10 @@ struct mem_cgroup {
*/
struct res_counter res;
- union {
- /*
- * the counter to account for mem+swap usage.
- */
- struct res_counter memsw;
-
- /*
- * rcu_freeing is used only when freeing struct mem_cgroup,
- * so put it into a union to avoid wasting more memory.
- * It must be disjoint from the css field. It could be
- * in a union with the res field, but res plays a much
- * larger part in mem_cgroup life than memsw, and might
- * be of interest, even at time of free, when debugging.
- * So share rcu_head with the less interesting memsw.
- */
- struct rcu_head rcu_freeing;
- /*
- * We also need some space for a worker in deferred freeing.
- * By the time we call it, rcu_freeing is no longer in use.
- */
- struct work_struct work_freeing;
- };
+ /*
+ * the counter to account for mem+swap usage.
+ */
+ struct res_counter memsw;
/*
* the counter to account for kernel memory usage.
@@ -6097,29 +6079,6 @@ static void __mem_cgroup_free(struct mem_cgroup *memcg)
vfree(memcg);
}
-
-/*
- * Helpers for freeing a kmalloc()ed/vzalloc()ed mem_cgroup by RCU,
- * but in process context. The work_freeing structure is overlaid
- * on the rcu_freeing structure, which itself is overlaid on memsw.
- */
-static void free_work(struct work_struct *work)
-{
- struct mem_cgroup *memcg;
-
- memcg = container_of(work, struct mem_cgroup, work_freeing);
- __mem_cgroup_free(memcg);
-}
-
-static void free_rcu(struct rcu_head *rcu_head)
-{
- struct mem_cgroup *memcg;
-
- memcg = container_of(rcu_head, struct mem_cgroup, rcu_freeing);
- INIT_WORK(&memcg->work_freeing, free_work);
- schedule_work(&memcg->work_freeing);
-}
-
/*
* Returns the parent mem_cgroup in memcgroup hierarchy with hierarchy enabled.
*/
@@ -6269,7 +6228,7 @@ static void mem_cgroup_css_free(struct cgroup *cont)
mem_cgroup_sockets_destroy(memcg);
- call_rcu(&memcg->rcu_freeing, free_rcu);
+ __mem_cgroup_free(memcg);
}
#ifdef CONFIG_MMU
--
1.8.0.2
WARNING: multiple messages have this Message-ID (diff)
From: Li Zefan <lizefan@huawei.com>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: Tejun Heo <tj@kernel.org>, Glauber Costa <glommer@parallels.com>,
KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
Johannes Weiner <hannes@cmpxchg.org>,
LKML <linux-kernel@vger.kernel.org>,
Cgroups <cgroups@vger.kernel.org>,
linux-mm@kvack.org, Hugh Dickins <hughd@google.com>
Subject: [PATCH 12/12] memcg: don't need to free memcg via RCU or workqueue
Date: Mon, 8 Apr 2013 14:36:32 +0800 [thread overview]
Message-ID: <51626570.8000400@huawei.com> (raw)
In-Reply-To: <5162648B.9070802@huawei.com>
Now memcg has the same life cycle with its corresponding cgroup, and
a cgroup is freed via RCU and then mem_cgroup_css_free() is called
in a work function, so we can simply call __mem_cgroup_free() in
mem_cgroup_css_free().
This actually reverts 59927fb984de1703c67bc640c3e522d8b5276c73
("memcg: free mem_cgroup by RCU to fix oops").
Cc: Hugh Dickins <hughd@google.com>
Signed-off-by: Li Zefan <lizefan@huawei.com>
---
mm/memcontrol.c | 51 +++++----------------------------------------------
1 file changed, 5 insertions(+), 46 deletions(-)
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index a6d44bc..5aa6e91 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -261,28 +261,10 @@ struct mem_cgroup {
*/
struct res_counter res;
- union {
- /*
- * the counter to account for mem+swap usage.
- */
- struct res_counter memsw;
-
- /*
- * rcu_freeing is used only when freeing struct mem_cgroup,
- * so put it into a union to avoid wasting more memory.
- * It must be disjoint from the css field. It could be
- * in a union with the res field, but res plays a much
- * larger part in mem_cgroup life than memsw, and might
- * be of interest, even at time of free, when debugging.
- * So share rcu_head with the less interesting memsw.
- */
- struct rcu_head rcu_freeing;
- /*
- * We also need some space for a worker in deferred freeing.
- * By the time we call it, rcu_freeing is no longer in use.
- */
- struct work_struct work_freeing;
- };
+ /*
+ * the counter to account for mem+swap usage.
+ */
+ struct res_counter memsw;
/*
* the counter to account for kernel memory usage.
@@ -6097,29 +6079,6 @@ static void __mem_cgroup_free(struct mem_cgroup *memcg)
vfree(memcg);
}
-
-/*
- * Helpers for freeing a kmalloc()ed/vzalloc()ed mem_cgroup by RCU,
- * but in process context. The work_freeing structure is overlaid
- * on the rcu_freeing structure, which itself is overlaid on memsw.
- */
-static void free_work(struct work_struct *work)
-{
- struct mem_cgroup *memcg;
-
- memcg = container_of(work, struct mem_cgroup, work_freeing);
- __mem_cgroup_free(memcg);
-}
-
-static void free_rcu(struct rcu_head *rcu_head)
-{
- struct mem_cgroup *memcg;
-
- memcg = container_of(rcu_head, struct mem_cgroup, rcu_freeing);
- INIT_WORK(&memcg->work_freeing, free_work);
- schedule_work(&memcg->work_freeing);
-}
-
/*
* Returns the parent mem_cgroup in memcgroup hierarchy with hierarchy enabled.
*/
@@ -6269,7 +6228,7 @@ static void mem_cgroup_css_free(struct cgroup *cont)
mem_cgroup_sockets_destroy(memcg);
- call_rcu(&memcg->rcu_freeing, free_rcu);
+ __mem_cgroup_free(memcg);
}
#ifdef CONFIG_MMU
--
1.8.0.2
--
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>
WARNING: multiple messages have this Message-ID (diff)
From: Li Zefan <lizefan@huawei.com>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: Tejun Heo <tj@kernel.org>, Glauber Costa <glommer@parallels.com>,
KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
Johannes Weiner <hannes@cmpxchg.org>,
LKML <linux-kernel@vger.kernel.org>,
Cgroups <cgroups@vger.kernel.org>, <linux-mm@kvack.org>,
Hugh Dickins <hughd@google.com>
Subject: [PATCH 12/12] memcg: don't need to free memcg via RCU or workqueue
Date: Mon, 8 Apr 2013 14:36:32 +0800 [thread overview]
Message-ID: <51626570.8000400@huawei.com> (raw)
In-Reply-To: <5162648B.9070802@huawei.com>
Now memcg has the same life cycle with its corresponding cgroup, and
a cgroup is freed via RCU and then mem_cgroup_css_free() is called
in a work function, so we can simply call __mem_cgroup_free() in
mem_cgroup_css_free().
This actually reverts 59927fb984de1703c67bc640c3e522d8b5276c73
("memcg: free mem_cgroup by RCU to fix oops").
Cc: Hugh Dickins <hughd@google.com>
Signed-off-by: Li Zefan <lizefan@huawei.com>
---
mm/memcontrol.c | 51 +++++----------------------------------------------
1 file changed, 5 insertions(+), 46 deletions(-)
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index a6d44bc..5aa6e91 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -261,28 +261,10 @@ struct mem_cgroup {
*/
struct res_counter res;
- union {
- /*
- * the counter to account for mem+swap usage.
- */
- struct res_counter memsw;
-
- /*
- * rcu_freeing is used only when freeing struct mem_cgroup,
- * so put it into a union to avoid wasting more memory.
- * It must be disjoint from the css field. It could be
- * in a union with the res field, but res plays a much
- * larger part in mem_cgroup life than memsw, and might
- * be of interest, even at time of free, when debugging.
- * So share rcu_head with the less interesting memsw.
- */
- struct rcu_head rcu_freeing;
- /*
- * We also need some space for a worker in deferred freeing.
- * By the time we call it, rcu_freeing is no longer in use.
- */
- struct work_struct work_freeing;
- };
+ /*
+ * the counter to account for mem+swap usage.
+ */
+ struct res_counter memsw;
/*
* the counter to account for kernel memory usage.
@@ -6097,29 +6079,6 @@ static void __mem_cgroup_free(struct mem_cgroup *memcg)
vfree(memcg);
}
-
-/*
- * Helpers for freeing a kmalloc()ed/vzalloc()ed mem_cgroup by RCU,
- * but in process context. The work_freeing structure is overlaid
- * on the rcu_freeing structure, which itself is overlaid on memsw.
- */
-static void free_work(struct work_struct *work)
-{
- struct mem_cgroup *memcg;
-
- memcg = container_of(work, struct mem_cgroup, work_freeing);
- __mem_cgroup_free(memcg);
-}
-
-static void free_rcu(struct rcu_head *rcu_head)
-{
- struct mem_cgroup *memcg;
-
- memcg = container_of(rcu_head, struct mem_cgroup, rcu_freeing);
- INIT_WORK(&memcg->work_freeing, free_work);
- schedule_work(&memcg->work_freeing);
-}
-
/*
* Returns the parent mem_cgroup in memcgroup hierarchy with hierarchy enabled.
*/
@@ -6269,7 +6228,7 @@ static void mem_cgroup_css_free(struct cgroup *cont)
mem_cgroup_sockets_destroy(memcg);
- call_rcu(&memcg->rcu_freeing, free_rcu);
+ __mem_cgroup_free(memcg);
}
#ifdef CONFIG_MMU
--
1.8.0.2
next prev parent reply other threads:[~2013-04-08 6:36 UTC|newest]
Thread overview: 81+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-04-08 6:32 [PATCH 0/12][V2] memcg: make memcg's life cycle the same as cgroup Li Zefan
2013-04-08 6:32 ` Li Zefan
2013-04-08 6:32 ` Li Zefan
[not found] ` <5162648B.9070802-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2013-04-08 6:33 ` [PATCH 01/12] memcg: take reference before releasing rcu_read_lock Li Zefan
2013-04-08 6:33 ` Li Zefan
2013-04-08 6:33 ` Li Zefan
2013-04-08 6:33 ` [PATCH 02/12] memcg: avoid accessing memcg after releasing reference Li Zefan
2013-04-08 6:33 ` Li Zefan
2013-04-08 6:33 ` Li Zefan
2013-04-08 6:33 ` [PATCH 03/12] Revert "memcg: avoid dangling reference count in creation failure." Li Zefan
2013-04-08 6:33 ` Li Zefan
2013-04-08 6:33 ` Li Zefan
2013-04-09 2:50 ` Kamezawa Hiroyuki
2013-04-09 2:50 ` Kamezawa Hiroyuki
2013-04-08 6:33 ` [PATCH 04/12] memcg, kmem: fix reference count handling on the error path Li Zefan
2013-04-08 6:33 ` Li Zefan
2013-04-08 6:33 ` Li Zefan
[not found] ` <516264D6.3090100-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2013-04-09 2:51 ` Kamezawa Hiroyuki
2013-04-09 2:51 ` Kamezawa Hiroyuki
2013-04-09 2:51 ` Kamezawa Hiroyuki
2013-04-08 6:35 ` [PATCH 09/12] cgroup: make sure parent won't be destroyed before its children Li Zefan
2013-04-08 6:35 ` Li Zefan
2013-04-08 6:35 ` Li Zefan
[not found] ` <51626516.3000603-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2013-04-08 15:36 ` Tejun Heo
2013-04-08 15:36 ` Tejun Heo
2013-04-08 15:36 ` Tejun Heo
2013-04-08 6:35 ` [PATCH 10/12] memcg: don't need to get a reference to the parent Li Zefan
2013-04-08 6:35 ` Li Zefan
2013-04-08 6:35 ` Li Zefan
2013-04-08 6:36 ` Li Zefan [this message]
2013-04-08 6:36 ` [PATCH 12/12] memcg: don't need to free memcg via RCU or workqueue Li Zefan
2013-04-08 6:36 ` Li Zefan
2013-04-08 14:15 ` Michal Hocko
2013-04-08 14:15 ` Michal Hocko
[not found] ` <51626570.8000400-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2013-04-09 2:57 ` Kamezawa Hiroyuki
2013-04-09 2:57 ` Kamezawa Hiroyuki
2013-04-09 2:57 ` Kamezawa Hiroyuki
2013-04-08 6:34 ` [PATCH 05/12] memcg: use css_get() in sock_update_memcg() Li Zefan
2013-04-08 6:34 ` Li Zefan
2013-04-08 6:34 ` Li Zefan
2013-04-08 6:34 ` [PATCH 06/12] memcg: don't use mem_cgroup_get() when creating a kmemcg cache Li Zefan
2013-04-08 6:34 ` Li Zefan
2013-04-08 6:34 ` Li Zefan
2013-04-09 2:53 ` Kamezawa Hiroyuki
2013-04-09 2:53 ` Kamezawa Hiroyuki
2013-04-08 6:34 ` [PATCH 07/12] memcg: use css_get/put when charging/uncharging kmem Li Zefan
2013-04-08 6:34 ` Li Zefan
2013-04-08 6:34 ` Li Zefan
2013-04-08 14:14 ` Michal Hocko
2013-04-08 14:14 ` Michal Hocko
2013-04-09 2:55 ` Kamezawa Hiroyuki
2013-04-09 2:55 ` Kamezawa Hiroyuki
2013-04-08 6:34 ` [PATCH 08/12] memcg: use css_get/put for swap memcg Li Zefan
2013-04-08 6:34 ` Li Zefan
2013-04-08 6:34 ` Li Zefan
2013-04-08 6:36 ` [PATCH 11/12] memcg: kill memcg refcnt Li Zefan
2013-04-08 6:36 ` Li Zefan
2013-04-08 6:36 ` Li Zefan
2013-04-08 6:36 ` [PATCH 13/12] memcg: don't need memcg->memcg_name Li Zefan
2013-04-08 6:36 ` Li Zefan
2013-04-08 6:36 ` Li Zefan
2013-04-08 14:25 ` Michal Hocko
2013-04-08 14:25 ` Michal Hocko
[not found] ` <20130408142503.GH17178-2MMpYkNvuYDjFM9bn6wA6Q@public.gmane.org>
2013-04-09 1:28 ` Li Zefan
2013-04-09 1:28 ` Li Zefan
2013-04-09 1:28 ` Li Zefan
2013-04-09 3:10 ` Kamezawa Hiroyuki
2013-04-09 3:10 ` Kamezawa Hiroyuki
[not found] ` <5163868B.3020905-+CUm20s59erQFUHtdCDX3A@public.gmane.org>
2013-04-09 3:18 ` Li Zefan
2013-04-09 3:18 ` Li Zefan
2013-04-09 3:18 ` Li Zefan
2013-04-09 3:46 ` Kamezawa Hiroyuki
2013-04-09 3:46 ` Kamezawa Hiroyuki
[not found] ` <51638F2B.3000800-+CUm20s59erQFUHtdCDX3A@public.gmane.org>
2013-04-09 7:55 ` Glauber Costa
2013-04-09 7:55 ` Glauber Costa
2013-04-09 7:55 ` Glauber Costa
[not found] ` <5163887D.1040809-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2013-04-09 3:59 ` Tejun Heo
2013-04-09 3:59 ` Tejun Heo
2013-04-09 3:59 ` Tejun Heo
2013-04-09 7:53 ` Glauber Costa
2013-04-09 7:53 ` Glauber Costa
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=51626570.8000400@huawei.com \
--to=lizefan-hv44wf8li93qt0dzr+alfa@public.gmane.org \
--cc=akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org \
--cc=cgroups-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=glommer-bzQdu9zFT3WakBO8gow8eQ@public.gmane.org \
--cc=hannes-druUgvl0LCNAfugRpC6u6w@public.gmane.org \
--cc=hughd-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org \
--cc=kamezawa.hiroyu-+CUm20s59erQFUHtdCDX3A@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-mm-Bw31MaZKKs3YtjvyW6yDsg@public.gmane.org \
--cc=tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.