From: Michal Hocko <mhocko@suse.cz>
To: Ying Han <yinghan@google.com>
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
Johannes Weiner <hannes@cmpxchg.org>,
Tejun Heo <htejun@gmail.com>,
Glauber Costa <glommer@parallels.com>,
Li Zefan <lizefan@huawei.com>
Subject: Re: [patch v2 4/6] memcg: simplify mem_cgroup_iter
Date: Tue, 11 Dec 2012 16:57:24 +0100 [thread overview]
Message-ID: <20121211155724.GD1612@dhcp22.suse.cz> (raw)
In-Reply-To: <CALWz4iw3v08Q3=nJRssOYjvpFa=yAJdmewYugogLcX_FBC1GmQ@mail.gmail.com>
On Sun 09-12-12 09:01:48, Ying Han wrote:
> On Mon, Nov 26, 2012 at 10:47 AM, Michal Hocko <mhocko@suse.cz> wrote:
> > Current implementation of mem_cgroup_iter has to consider both css and
> > memcg to find out whether no group has been found (css==NULL - aka the
> > loop is completed) and that no memcg is associated with the found node
> > (!memcg - aka css_tryget failed because the group is no longer alive).
> > This leads to awkward tweaks like tests for css && !memcg to skip the
> > current node.
> >
> > It will be much easier if we got rid off css variable altogether and
> > only rely on memcg. In order to do that the iteration part has to skip
> > dead nodes. This sounds natural to me and as a nice side effect we will
> > get a simple invariant that memcg is always alive when non-NULL and all
> > nodes have been visited otherwise.
> >
> > We could get rid of the surrounding while loop but keep it in for now to
> > make review easier. It will go away in the following patch.
> >
> > Signed-off-by: Michal Hocko <mhocko@suse.cz>
> > ---
> > mm/memcontrol.c | 56 +++++++++++++++++++++++++++----------------------------
> > 1 file changed, 27 insertions(+), 29 deletions(-)
> >
> > diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> > index 6bcc97b..d1bc0e8 100644
> > --- a/mm/memcontrol.c
> > +++ b/mm/memcontrol.c
> > @@ -1086,7 +1086,6 @@ struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *root,
> > rcu_read_lock();
^^^^^^^^
here
> > while (!memcg) {
> > struct mem_cgroup_reclaim_iter *uninitialized_var(iter);
> > - struct cgroup_subsys_state *css = NULL;
> >
> > if (reclaim) {
> > int nid = zone_to_nid(reclaim->zone);
[...]
> > +skip_node:
> > + next_cgroup = cgroup_next_descendant_pre(
> > + prev_cgroup, root->css.cgroup);
> >
> > - /*
> > - * Even if we found a group we have to make sure it is alive.
> > - * css && !memcg means that the groups should be skipped and
> > - * we should continue the tree walk.
> > - * last_visited css is safe to use because it is protected by
> > - * css_get and the tree walk is rcu safe.
> > - */
> > - if (css == &root->css || (css && css_tryget(css)))
> > - memcg = mem_cgroup_from_css(css);
> > + /*
> > + * Even if we found a group we have to make sure it is
> > + * alive. css && !memcg means that the groups should be
> > + * skipped and we should continue the tree walk.
> > + * last_visited css is safe to use because it is
> > + * protected by css_get and the tree walk is rcu safe.
> > + */
> > + if (next_cgroup) {
> > + struct mem_cgroup *mem = mem_cgroup_from_cont(
> > + next_cgroup);
> > + if (css_tryget(&mem->css))
> > + memcg = mem;
> > + else {
> > + prev_cgroup = next_cgroup;
>
> I might be missing something here, but the comment says the
> last_visited is safe to use but not the next_cgroup. What is
> preventing it to be
> removed ?
rcu_read_lock. cgroup cannot disappear inside rcu.
>
> --Ying
[...]
--
Michal Hocko
SUSE Labs
--
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: Michal Hocko <mhocko@suse.cz>
To: Ying Han <yinghan@google.com>
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
Johannes Weiner <hannes@cmpxchg.org>,
Tejun Heo <htejun@gmail.com>,
Glauber Costa <glommer@parallels.com>,
Li Zefan <lizefan@huawei.com>
Subject: Re: [patch v2 4/6] memcg: simplify mem_cgroup_iter
Date: Tue, 11 Dec 2012 16:57:24 +0100 [thread overview]
Message-ID: <20121211155724.GD1612@dhcp22.suse.cz> (raw)
In-Reply-To: <CALWz4iw3v08Q3=nJRssOYjvpFa=yAJdmewYugogLcX_FBC1GmQ@mail.gmail.com>
On Sun 09-12-12 09:01:48, Ying Han wrote:
> On Mon, Nov 26, 2012 at 10:47 AM, Michal Hocko <mhocko@suse.cz> wrote:
> > Current implementation of mem_cgroup_iter has to consider both css and
> > memcg to find out whether no group has been found (css==NULL - aka the
> > loop is completed) and that no memcg is associated with the found node
> > (!memcg - aka css_tryget failed because the group is no longer alive).
> > This leads to awkward tweaks like tests for css && !memcg to skip the
> > current node.
> >
> > It will be much easier if we got rid off css variable altogether and
> > only rely on memcg. In order to do that the iteration part has to skip
> > dead nodes. This sounds natural to me and as a nice side effect we will
> > get a simple invariant that memcg is always alive when non-NULL and all
> > nodes have been visited otherwise.
> >
> > We could get rid of the surrounding while loop but keep it in for now to
> > make review easier. It will go away in the following patch.
> >
> > Signed-off-by: Michal Hocko <mhocko@suse.cz>
> > ---
> > mm/memcontrol.c | 56 +++++++++++++++++++++++++++----------------------------
> > 1 file changed, 27 insertions(+), 29 deletions(-)
> >
> > diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> > index 6bcc97b..d1bc0e8 100644
> > --- a/mm/memcontrol.c
> > +++ b/mm/memcontrol.c
> > @@ -1086,7 +1086,6 @@ struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *root,
> > rcu_read_lock();
^^^^^^^^
here
> > while (!memcg) {
> > struct mem_cgroup_reclaim_iter *uninitialized_var(iter);
> > - struct cgroup_subsys_state *css = NULL;
> >
> > if (reclaim) {
> > int nid = zone_to_nid(reclaim->zone);
[...]
> > +skip_node:
> > + next_cgroup = cgroup_next_descendant_pre(
> > + prev_cgroup, root->css.cgroup);
> >
> > - /*
> > - * Even if we found a group we have to make sure it is alive.
> > - * css && !memcg means that the groups should be skipped and
> > - * we should continue the tree walk.
> > - * last_visited css is safe to use because it is protected by
> > - * css_get and the tree walk is rcu safe.
> > - */
> > - if (css == &root->css || (css && css_tryget(css)))
> > - memcg = mem_cgroup_from_css(css);
> > + /*
> > + * Even if we found a group we have to make sure it is
> > + * alive. css && !memcg means that the groups should be
> > + * skipped and we should continue the tree walk.
> > + * last_visited css is safe to use because it is
> > + * protected by css_get and the tree walk is rcu safe.
> > + */
> > + if (next_cgroup) {
> > + struct mem_cgroup *mem = mem_cgroup_from_cont(
> > + next_cgroup);
> > + if (css_tryget(&mem->css))
> > + memcg = mem;
> > + else {
> > + prev_cgroup = next_cgroup;
>
> I might be missing something here, but the comment says the
> last_visited is safe to use but not the next_cgroup. What is
> preventing it to be
> removed ?
rcu_read_lock. cgroup cannot disappear inside rcu.
>
> --Ying
[...]
--
Michal Hocko
SUSE Labs
next prev parent reply other threads:[~2012-12-11 15:57 UTC|newest]
Thread overview: 114+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-26 18:47 rework mem_cgroup iterator Michal Hocko
2012-11-26 18:47 ` Michal Hocko
2012-11-26 18:47 ` [patch v2 1/6] memcg: synchronize per-zone iterator access by a spinlock Michal Hocko
2012-11-26 18:47 ` Michal Hocko
2012-11-26 18:47 ` [patch v2 2/6] memcg: keep prev's css alive for the whole mem_cgroup_iter Michal Hocko
2012-11-26 18:47 ` Michal Hocko
2012-11-28 8:38 ` Kamezawa Hiroyuki
2012-11-28 8:38 ` Kamezawa Hiroyuki
2012-11-26 18:47 ` [patch v2 3/6] memcg: rework mem_cgroup_iter to use cgroup iterators Michal Hocko
2012-11-26 18:47 ` Michal Hocko
2012-11-28 8:47 ` Kamezawa Hiroyuki
2012-11-28 8:47 ` Kamezawa Hiroyuki
2012-11-28 9:17 ` Michal Hocko
2012-11-28 9:17 ` Michal Hocko
2012-11-28 9:23 ` Glauber Costa
2012-11-28 9:23 ` Glauber Costa
2012-11-28 9:33 ` Michal Hocko
2012-11-28 9:33 ` Michal Hocko
2012-11-28 9:35 ` Glauber Costa
2012-11-28 9:35 ` Glauber Costa
2012-11-30 4:07 ` Kamezawa Hiroyuki
2012-11-30 4:07 ` Kamezawa Hiroyuki
2012-12-07 3:39 ` Ying Han
2012-12-07 3:39 ` Ying Han
2012-12-07 3:43 ` Ying Han
2012-12-07 3:43 ` Ying Han
2012-12-07 8:58 ` Michal Hocko
2012-12-07 8:58 ` Michal Hocko
2012-12-07 17:12 ` Ying Han
2012-12-07 17:12 ` Ying Han
2012-12-07 17:27 ` Michal Hocko
2012-12-07 17:27 ` Michal Hocko
2012-12-07 19:16 ` Ying Han
2012-12-07 19:16 ` Ying Han
2012-12-07 19:35 ` Michal Hocko
2012-12-07 19:35 ` Michal Hocko
2012-12-07 9:01 ` Michal Hocko
2012-12-07 9:01 ` Michal Hocko
2012-12-09 16:59 ` Ying Han
2012-12-09 16:59 ` Ying Han
2012-12-11 15:50 ` Michal Hocko
2012-12-11 15:50 ` Michal Hocko
2012-12-11 16:15 ` Michal Hocko
2012-12-11 16:15 ` Michal Hocko
2012-12-11 18:10 ` Michal Hocko
2012-12-11 18:10 ` Michal Hocko
2012-12-11 22:43 ` Ying Han
2012-12-11 22:43 ` Ying Han
2012-12-12 8:55 ` Michal Hocko
2012-12-12 8:55 ` Michal Hocko
2012-12-12 17:57 ` Ying Han
2012-12-12 17:57 ` Ying Han
2012-12-12 18:08 ` Michal Hocko
2012-12-12 18:08 ` Michal Hocko
2012-12-11 22:31 ` Ying Han
2012-12-11 22:31 ` Ying Han
2012-12-09 19:39 ` Ying Han
2012-12-09 19:39 ` Ying Han
2012-12-11 15:54 ` Michal Hocko
2012-12-11 15:54 ` Michal Hocko
2012-12-11 22:36 ` Ying Han
2012-12-11 22:36 ` Ying Han
2012-12-12 9:06 ` Michal Hocko
2012-12-12 9:06 ` Michal Hocko
2012-12-12 18:09 ` Ying Han
2012-12-12 18:09 ` Ying Han
2012-12-12 18:34 ` Michal Hocko
2012-12-12 18:34 ` Michal Hocko
2012-12-12 18:42 ` Michal Hocko
2012-12-12 18:42 ` Michal Hocko
2012-12-14 1:06 ` Ying Han
2012-12-14 1:06 ` Ying Han
2012-12-14 10:56 ` [PATCH] memcg,vmscan: do not break out targeted reclaim without reclaimed pages Michal Hocko
2012-12-14 10:56 ` Michal Hocko
2012-12-12 19:24 ` [patch v2 3/6] memcg: rework mem_cgroup_iter to use cgroup iterators Michal Hocko
2012-12-12 19:24 ` Michal Hocko
2012-12-14 1:14 ` Ying Han
2012-12-14 1:14 ` Ying Han
2012-12-14 12:07 ` Michal Hocko
2012-12-14 12:07 ` Michal Hocko
2012-12-14 23:08 ` Ying Han
2012-12-14 23:08 ` Ying Han
2012-12-14 12:37 ` Michal Hocko
2012-12-14 12:37 ` Michal Hocko
2012-11-26 18:47 ` [patch v2 4/6] memcg: simplify mem_cgroup_iter Michal Hocko
2012-11-26 18:47 ` Michal Hocko
2012-11-28 8:52 ` Kamezawa Hiroyuki
2012-11-28 8:52 ` Kamezawa Hiroyuki
2012-11-30 4:09 ` Kamezawa Hiroyuki
2012-11-30 4:09 ` Kamezawa Hiroyuki
2012-12-09 17:01 ` Ying Han
2012-12-09 17:01 ` Ying Han
2012-12-11 15:57 ` Michal Hocko [this message]
2012-12-11 15:57 ` Michal Hocko
2012-12-11 4:35 ` Ying Han
2012-12-11 4:35 ` Ying Han
2012-12-11 16:01 ` Michal Hocko
2012-12-11 16:01 ` Michal Hocko
2012-12-11 22:52 ` Ying Han
2012-12-11 22:52 ` Ying Han
2012-11-26 18:47 ` [patch v2 5/6] memcg: further " Michal Hocko
2012-11-26 18:47 ` Michal Hocko
2012-11-30 4:10 ` Kamezawa Hiroyuki
2012-11-30 4:10 ` Kamezawa Hiroyuki
2012-11-30 9:08 ` Glauber Costa
2012-11-30 9:08 ` Glauber Costa
2012-11-30 10:23 ` Michal Hocko
2012-11-30 10:23 ` Michal Hocko
2012-11-26 18:47 ` [patch v2 6/6] cgroup: remove css_get_next Michal Hocko
2012-11-26 18:47 ` Michal Hocko
2012-11-30 4:12 ` Kamezawa Hiroyuki
2012-11-30 4:12 ` Kamezawa Hiroyuki
2012-11-30 8:18 ` Michal Hocko
2012-11-30 8:18 ` Michal Hocko
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=20121211155724.GD1612@dhcp22.suse.cz \
--to=mhocko@suse.cz \
--cc=glommer@parallels.com \
--cc=hannes@cmpxchg.org \
--cc=htejun@gmail.com \
--cc=kamezawa.hiroyu@jp.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=lizefan@huawei.com \
--cc=yinghan@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 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.