2012-06-10 18:55:18

by Hugh Dickins

[permalink] [raw]
Subject: [PATCH] memcg: fix use_hierarchy css_is_ancestor oops regression

If use_hierarchy is set, reclaim testing soon oopses in css_is_ancestor()
called from __mem_cgroup_same_or_subtree() called from page_referenced():
when processes are exiting, it's easy for mm_match_cgroup() to pass along
a NULL memcg coming from a NULL mm->owner.

Check for that in __mem_cgroup_same_or_subtree(). Return true or false?
False because we cannot know if it was in the hierarchy, but also false
because it's better not to count a reference from an exiting process.

Signed-off-by: Hugh Dickins <[email protected]>
---
This a 3.5-rc issue: not needed for stable.

mm/memcontrol.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

--- 3.5-rc2/mm/memcontrol.c 2012-05-30 08:17:19.400008280 -0700
+++ linux/mm/memcontrol.c 2012-06-10 08:39:39.618182396 -0700
@@ -1148,7 +1148,7 @@ bool __mem_cgroup_same_or_subtree(const
{
if (root_memcg == memcg)
return true;
- if (!root_memcg->use_hierarchy)
+ if (!root_memcg->use_hierarchy || !memcg)
return false;
return css_is_ancestor(&memcg->css, &root_memcg->css);
}


2012-06-10 22:15:36

by Johannes Weiner

[permalink] [raw]
Subject: Re: [PATCH] memcg: fix use_hierarchy css_is_ancestor oops regression

On Sun, Jun 10, 2012 at 11:54:47AM -0700, Hugh Dickins wrote:
> If use_hierarchy is set, reclaim testing soon oopses in css_is_ancestor()
> called from __mem_cgroup_same_or_subtree() called from page_referenced():
> when processes are exiting, it's easy for mm_match_cgroup() to pass along
> a NULL memcg coming from a NULL mm->owner.
>
> Check for that in __mem_cgroup_same_or_subtree(). Return true or false?
> False because we cannot know if it was in the hierarchy, but also false
> because it's better not to count a reference from an exiting process.
>
> Signed-off-by: Hugh Dickins <[email protected]>

Looks like an older version of the patch that introduced it slipped
into the tree, Konstantin noted this problem during review. The final
version did

match = memcg && __mem_cgroup_same_or_subtree(root, memcg);

in the caller because of it.

Do you think it would be cleaner this way, since this is also the
place where that memcg is looked up, and so the "can return NULL"
handling after mem_cgroup_from_task() would be in the same place?

But either way,

Acked-by: Johannes Weiner <[email protected]>

Thanks, Hugh!

2012-06-10 22:53:40

by Hugh Dickins

[permalink] [raw]
Subject: Re: [PATCH] memcg: fix use_hierarchy css_is_ancestor oops regression

On Mon, 11 Jun 2012, Johannes Weiner wrote:
> On Sun, Jun 10, 2012 at 11:54:47AM -0700, Hugh Dickins wrote:
> > If use_hierarchy is set, reclaim testing soon oopses in css_is_ancestor()
> > called from __mem_cgroup_same_or_subtree() called from page_referenced():
> > when processes are exiting, it's easy for mm_match_cgroup() to pass along
> > a NULL memcg coming from a NULL mm->owner.
> >
> > Check for that in __mem_cgroup_same_or_subtree(). Return true or false?
> > False because we cannot know if it was in the hierarchy, but also false
> > because it's better not to count a reference from an exiting process.
> >
> > Signed-off-by: Hugh Dickins <[email protected]>
>
> Looks like an older version of the patch that introduced it slipped
> into the tree, Konstantin noted this problem during review. The final
> version did
>
> match = memcg && __mem_cgroup_same_or_subtree(root, memcg);
>
> in the caller because of it.
>
> Do you think it would be cleaner this way, since this is also the
> place where that memcg is looked up, and so the "can return NULL"
> handling after mem_cgroup_from_task() would be in the same place?

I don't mind, either way.

It depends on whether we add more such uses which could receive a NULL
memcg. I tend to prefer dealing with rare conditions (which this is)
inside the callee, but common conditions before calling from the caller.

But let's let others decide.

>
> But either way,
>
> Acked-by: Johannes Weiner <[email protected]>
>
> Thanks, Hugh!

And thank you, Hannes!

Hugh

2012-06-11 07:08:15

by Kamezawa Hiroyuki

[permalink] [raw]
Subject: Re: [PATCH] memcg: fix use_hierarchy css_is_ancestor oops regression

(2012/06/11 3:54), Hugh Dickins wrote:
> If use_hierarchy is set, reclaim testing soon oopses in css_is_ancestor()
> called from __mem_cgroup_same_or_subtree() called from page_referenced():
> when processes are exiting, it's easy for mm_match_cgroup() to pass along
> a NULL memcg coming from a NULL mm->owner.
>
> Check for that in __mem_cgroup_same_or_subtree(). Return true or false?
> False because we cannot know if it was in the hierarchy, but also false
> because it's better not to count a reference from an exiting process.
>
> Signed-off-by: Hugh Dickins<[email protected]>

Acked-by: KAMEZAWA Hiroyuki <[email protected]>

2012-06-11 07:29:32

by Konstantin Khlebnikov

[permalink] [raw]
Subject: Re: [PATCH] memcg: fix use_hierarchy css_is_ancestor oops regression

Johannes Weiner wrote:
> On Sun, Jun 10, 2012 at 11:54:47AM -0700, Hugh Dickins wrote:
>> If use_hierarchy is set, reclaim testing soon oopses in css_is_ancestor()
>> called from __mem_cgroup_same_or_subtree() called from page_referenced():
>> when processes are exiting, it's easy for mm_match_cgroup() to pass along
>> a NULL memcg coming from a NULL mm->owner.
>>
>> Check for that in __mem_cgroup_same_or_subtree(). Return true or false?
>> False because we cannot know if it was in the hierarchy, but also false
>> because it's better not to count a reference from an exiting process.
>>
>> Signed-off-by: Hugh Dickins<[email protected]>
>
> Looks like an older version of the patch that introduced it slipped
> into the tree, Konstantin noted this problem during review. The final
> version did
>
> match = memcg&& __mem_cgroup_same_or_subtree(root, memcg);
>
> in the caller because of it.
>
> Do you think it would be cleaner this way, since this is also the
> place where that memcg is looked up, and so the "can return NULL"
> handling after mem_cgroup_from_task() would be in the same place?

I agree, it cleaner, but nevertheless:

Acked-by: Konstantin Khlebnikov <[email protected]>

Thanks, Hugh!

>
> But either way,
>
> Acked-by: Johannes Weiner<[email protected]>
>
> Thanks, Hugh!
>
> --
> To unsubscribe, send a message with 'unsubscribe linux-mm' in
> the body to [email protected]. For more info on Linux MM,
> see: http://www.linux-mm.org/ .
> Don't email:<a href=mailto:"[email protected]"> [email protected]</a>

2012-06-11 07:34:51

by Michal Hocko

[permalink] [raw]
Subject: Re: [PATCH] memcg: fix use_hierarchy css_is_ancestor oops regression

On Sun 10-06-12 11:54:47, Hugh Dickins wrote:
> If use_hierarchy is set, reclaim testing soon oopses in css_is_ancestor()
> called from __mem_cgroup_same_or_subtree() called from page_referenced():
> when processes are exiting, it's easy for mm_match_cgroup() to pass along
> a NULL memcg coming from a NULL mm->owner.
>
> Check for that in __mem_cgroup_same_or_subtree(). Return true or false?
> False because we cannot know if it was in the hierarchy, but also false
> because it's better not to count a reference from an exiting process.
>
> Signed-off-by: Hugh Dickins <[email protected]>

Acked-by: Michal Hocko <[email protected]>

Thanks

> ---
> This a 3.5-rc issue: not needed for stable.
>
> mm/memcontrol.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> --- 3.5-rc2/mm/memcontrol.c 2012-05-30 08:17:19.400008280 -0700
> +++ linux/mm/memcontrol.c 2012-06-10 08:39:39.618182396 -0700
> @@ -1148,7 +1148,7 @@ bool __mem_cgroup_same_or_subtree(const
> {
> if (root_memcg == memcg)
> return true;
> - if (!root_memcg->use_hierarchy)
> + if (!root_memcg->use_hierarchy || !memcg)
> return false;
> return css_is_ancestor(&memcg->css, &root_memcg->css);
> }

--
Michal Hocko
SUSE Labs
SUSE LINUX s.r.o.
Lihovarska 1060/12
190 00 Praha 9
Czech Republic