From: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp>
To: balbir@linux.vnet.ibm.com
Cc: nishimura@mxp.nes.nec.co.jp, linux-mm@kvack.org,
linux-kernel@vger.kernel.org, kamezawa.hiroyu@jp.fujitsu.com,
lizf@cn.fujitsu.com, menage@google.com
Subject: Re: [RFC][PATCH 2/4] memcg: fix error path of mem_cgroup_move_parent
Date: Fri, 9 Jan 2009 14:33:46 +0900 [thread overview]
Message-ID: <20090109143346.5ad2b971.nishimura@mxp.nes.nec.co.jp> (raw)
In-Reply-To: <20090109051522.GC9737@balbir.in.ibm.com>
On Fri, 9 Jan 2009 10:45:22 +0530, Balbir Singh <balbir@linux.vnet.ibm.com> wrote:
> * Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> [2009-01-08 19:14:45]:
>
> > There is a bug in error path of mem_cgroup_move_parent.
> >
> > Extra refcnt got from try_charge should be dropped, and usages incremented
> > by try_charge should be decremented in both error paths:
> >
> > A: failure at get_page_unless_zero
> > B: failure at isolate_lru_page
> >
> > This bug makes this parent directory unremovable.
> >
> > In case of A, rmdir doesn't return, because res.usage doesn't go
> > down to 0 at mem_cgroup_force_empty even after all the pc in
> > lru are removed.
> > In case of B, rmdir fails and returns -EBUSY, because it has
> > extra ref counts even after res.usage goes down to 0.
> >
> >
> > Signed-off-by: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp>
> > ---
> > mm/memcontrol.c | 23 +++++++++++++++--------
> > 1 files changed, 15 insertions(+), 8 deletions(-)
> >
> > diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> > index 62e69d8..288e22c 100644
> > --- a/mm/memcontrol.c
> > +++ b/mm/memcontrol.c
> > @@ -983,14 +983,15 @@ static int mem_cgroup_move_account(struct page_cgroup *pc,
> > if (pc->mem_cgroup != from)
> > goto out;
> >
> > - css_put(&from->css);
> > res_counter_uncharge(&from->res, PAGE_SIZE);
> > mem_cgroup_charge_statistics(from, pc, false);
> > if (do_swap_account)
> > res_counter_uncharge(&from->memsw, PAGE_SIZE);
> > + css_put(&from->css);
> > +
> > + css_get(&to->css);
> > pc->mem_cgroup = to;
> > mem_cgroup_charge_statistics(to, pc, true);
> > - css_get(&to->css);
> > ret = 0;
> > out:
> > unlock_page_cgroup(pc);
> > @@ -1023,8 +1024,10 @@ static int mem_cgroup_move_parent(struct page_cgroup *pc,
> > if (ret || !parent)
> > return ret;
> >
> > - if (!get_page_unless_zero(page))
> > - return -EBUSY;
> > + if (!get_page_unless_zero(page)) {
> > + ret = -EBUSY;
> > + goto uncharge;
> > + }
> >
> > ret = isolate_lru_page(page);
> >
> > @@ -1033,19 +1036,23 @@ static int mem_cgroup_move_parent(struct page_cgroup *pc,
> >
> > ret = mem_cgroup_move_account(pc, child, parent);
> >
> > - /* drop extra refcnt by try_charge() (move_account increment one) */
> > - css_put(&parent->css);
> > putback_lru_page(page);
> > if (!ret) {
> > put_page(page);
> > + /* drop extra refcnt by try_charge() */
> > + css_put(&parent->css);
> > return 0;
> > }
> > - /* uncharge if move fails */
> > +
> > cancel:
> > + put_page(page);
> > +uncharge:
> > + /* drop extra refcnt by try_charge() */
> > + css_put(&parent->css);
> > + /* uncharge if move fails */
> > res_counter_uncharge(&parent->res, PAGE_SIZE);
> > if (do_swap_account)
> > res_counter_uncharge(&parent->memsw, PAGE_SIZE);
> > - put_page(page);
> > return ret;
> > }
> >
> >
>
> Looks good to me, just out of curiousity how did you catch this error?
> Through review or testing?
>
Through testing.
I got "an unremovable directory" sometimes, which had res.usage remained
even after all lru lists had become empty, or which had ref counts remained
even after res.usage had become 0.
And tracked down the cause of this problem .
Thanks,
Daisuke Nishimura.
--
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 prev parent reply other threads:[~2009-01-09 5:40 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-01-08 10:08 [RFC][PATCH 0/4] some memcg fixes Daisuke Nishimura
2009-01-08 10:14 ` [RFC][PATCH 1/4] memcg: fix for mem_cgroup_get_reclaim_stat_from_page Daisuke Nishimura
2009-01-08 10:59 ` [RFC][PATCH 1/4] memcg: fix formem_cgroup_get_reclaim_stat_from_page KAMEZAWA Hiroyuki
2009-01-09 0:57 ` [RFC][PATCH 1/4] memcg: fix for mem_cgroup_get_reclaim_stat_from_page Li Zefan
2009-01-09 1:05 ` KAMEZAWA Hiroyuki
2009-01-09 2:34 ` Daisuke Nishimura
2009-01-09 2:41 ` KAMEZAWA Hiroyuki
2009-01-09 4:32 ` Balbir Singh
2009-01-09 4:47 ` KAMEZAWA Hiroyuki
2009-01-15 11:08 ` [PATCH] mark_page_accessed() in do_swap_page() move latter than memcg charge KOSAKI Motohiro
2009-01-15 11:12 ` KAMEZAWA Hiroyuki
2009-01-15 11:30 ` Balbir Singh
2009-01-15 12:07 ` Hugh Dickins
2009-01-15 12:28 ` KAMEZAWA Hiroyuki
2009-01-15 13:34 ` KOSAKI Motohiro
2009-01-15 13:43 ` KOSAKI Motohiro
2009-01-08 10:14 ` [RFC][PATCH 2/4] memcg: fix error path of mem_cgroup_move_parent Daisuke Nishimura
2009-01-08 11:00 ` KAMEZAWA Hiroyuki
2009-01-09 5:15 ` Balbir Singh
2009-01-09 5:33 ` Daisuke Nishimura [this message]
2009-01-09 6:01 ` Balbir Singh
2009-01-08 10:15 ` [RFC][PATCH 3/4] memcg: fix for mem_cgroup_hierarchical_reclaim Daisuke Nishimura
2009-01-08 11:08 ` KAMEZAWA Hiroyuki
2009-01-09 1:08 ` KAMEZAWA Hiroyuki
2009-01-09 2:51 ` Daisuke Nishimura
2009-01-09 3:09 ` KAMEZAWA Hiroyuki
2009-01-09 5:34 ` Balbir Singh
2009-01-09 5:33 ` Balbir Singh
2009-01-09 6:01 ` Daisuke Nishimura
2009-01-09 9:01 ` Daisuke Nishimura
2009-01-08 10:15 ` [RFC][PATCH 4/4] memcg: make oom less frequently Daisuke Nishimura
2009-01-08 11:19 ` KAMEZAWA Hiroyuki
2009-01-09 1:44 ` Daisuke Nishimura
2009-01-09 2:03 ` KAMEZAWA Hiroyuki
2009-01-09 2:29 ` Daisuke Nishimura
2009-01-09 2:39 ` KAMEZAWA Hiroyuki
2009-01-09 5:58 ` Balbir Singh
2009-01-09 8:52 ` Daisuke Nishimura
2009-01-09 9:03 ` Balbir Singh
2009-01-09 9:37 ` KAMEZAWA Hiroyuki
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=20090109143346.5ad2b971.nishimura@mxp.nes.nec.co.jp \
--to=nishimura@mxp.nes.nec.co.jp \
--cc=balbir@linux.vnet.ibm.com \
--cc=kamezawa.hiroyu@jp.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=lizf@cn.fujitsu.com \
--cc=menage@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