2010-06-03 08:28:14

by Kamezawa Hiroyuki

[permalink] [raw]
Subject: [BUGFIX][PATCH] memcg fix wake up in oom wait queue

Very sorry that my test wasn't enough and delayed.

==
From: KAMEZAWA Hiroyuki <[email protected]>

OOM-waitqueue should be waken up when oom_disable is canceled.
This is a fix for
memcg-oom-kill-disable-and-oom-status.patch

How to test:
Create a cgroup A...
1. set memory.limit and memory.memsw.limit to be small value
2. echo 1 > /cgroup/A/memory.oom_control, this disables oom-kill.
3. run a program which must cause OOM.

A program executed in 3 will sleep by oom_waiqueue in memcg.
Then, how to wake it up is problem.

1. echo 0 > /cgroup/A/memory.oom_control (enable OOM-killer)
2. echo big mem > /cgroup/A/memory.memsw.limit_in_bytes(allow more swap)
etc..

Without the patch, a task in slept can not be waken up.

Signed-off-by: KAMEZAWA Hiroyuki <[email protected]>
---
mm/memcontrol.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)

Index: mmotm-2.6.34-May21/mm/memcontrol.c
===================================================================
--- mmotm-2.6.34-May21.orig/mm/memcontrol.c
+++ mmotm-2.6.34-May21/mm/memcontrol.c
@@ -1413,7 +1413,7 @@ static void memcg_wakeup_oom(struct mem_

static void memcg_oom_recover(struct mem_cgroup *mem)
{
- if (mem->oom_kill_disable && atomic_read(&mem->oom_lock))
+ if (atomic_read(&mem->oom_lock))
memcg_wakeup_oom(mem);
}

@@ -3830,6 +3830,8 @@ static int mem_cgroup_oom_control_write(
return -EINVAL;
}
mem->oom_kill_disable = val;
+ if (!val)
+ memcg_oom_recover(mem);
cgroup_unlock();
return 0;
}


2010-06-04 01:25:12

by Daisuke Nishimura

[permalink] [raw]
Subject: Re: [BUGFIX][PATCH] memcg fix wake up in oom wait queue

On Thu, 3 Jun 2010 17:23:53 +0900, KAMEZAWA Hiroyuki <[email protected]> wrote:
> Very sorry that my test wasn't enough and delayed.
>
> ==
> From: KAMEZAWA Hiroyuki <[email protected]>
>
> OOM-waitqueue should be waken up when oom_disable is canceled.
> This is a fix for
> memcg-oom-kill-disable-and-oom-status.patch
>
> How to test:
> Create a cgroup A...
> 1. set memory.limit and memory.memsw.limit to be small value
> 2. echo 1 > /cgroup/A/memory.oom_control, this disables oom-kill.
> 3. run a program which must cause OOM.
>
> A program executed in 3 will sleep by oom_waiqueue in memcg.
> Then, how to wake it up is problem.
>
> 1. echo 0 > /cgroup/A/memory.oom_control (enable OOM-killer)
> 2. echo big mem > /cgroup/A/memory.memsw.limit_in_bytes(allow more swap)
> etc..
>
> Without the patch, a task in slept can not be waken up.
>

Acked-by: Daisuke Nishimura <[email protected]>

> Signed-off-by: KAMEZAWA Hiroyuki <[email protected]>
> ---
> mm/memcontrol.c | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
>
> Index: mmotm-2.6.34-May21/mm/memcontrol.c
> ===================================================================
> --- mmotm-2.6.34-May21.orig/mm/memcontrol.c
> +++ mmotm-2.6.34-May21/mm/memcontrol.c
> @@ -1413,7 +1413,7 @@ static void memcg_wakeup_oom(struct mem_
>
> static void memcg_oom_recover(struct mem_cgroup *mem)
> {
> - if (mem->oom_kill_disable && atomic_read(&mem->oom_lock))
> + if (atomic_read(&mem->oom_lock))
> memcg_wakeup_oom(mem);
> }
>
> @@ -3830,6 +3830,8 @@ static int mem_cgroup_oom_control_write(
> return -EINVAL;
> }
> mem->oom_kill_disable = val;
> + if (!val)
> + memcg_oom_recover(mem);
> cgroup_unlock();
> return 0;
> }
>

2010-06-04 01:27:06

by Kamezawa Hiroyuki

[permalink] [raw]
Subject: Re: [BUGFIX][PATCH] memcg fix wake up in oom wait queue

On Fri, 4 Jun 2010 10:08:11 +0900
Daisuke Nishimura <[email protected]> wrote:

> On Thu, 3 Jun 2010 17:23:53 +0900, KAMEZAWA Hiroyuki <[email protected]> wrote:
> > Very sorry that my test wasn't enough and delayed.
> >
> > ==
> > From: KAMEZAWA Hiroyuki <[email protected]>
> >
> > OOM-waitqueue should be waken up when oom_disable is canceled.
> > This is a fix for
> > memcg-oom-kill-disable-and-oom-status.patch
> >
> > How to test:
> > Create a cgroup A...
> > 1. set memory.limit and memory.memsw.limit to be small value
> > 2. echo 1 > /cgroup/A/memory.oom_control, this disables oom-kill.
> > 3. run a program which must cause OOM.
> >
> > A program executed in 3 will sleep by oom_waiqueue in memcg.
> > Then, how to wake it up is problem.
> >
> > 1. echo 0 > /cgroup/A/memory.oom_control (enable OOM-killer)
> > 2. echo big mem > /cgroup/A/memory.memsw.limit_in_bytes(allow more swap)
> > etc..
> >
> > Without the patch, a task in slept can not be waken up.
> >
>
> Acked-by: Daisuke Nishimura <[email protected]>
>
Thanks. I'll try to rebase this onto the latest mmotm.

-Kame

2010-06-04 03:02:40

by Kamezawa Hiroyuki

[permalink] [raw]
Subject: [BUGFIX][PATCH] memcg fix wake up in oom wait queue

Tested on mmotm-2010-06-03 and works well.
==
From: KAMEZAWA Hiroyuki <[email protected]>

OOM-waitqueue should be waken up when oom_disable is canceled.
This is a fix for
memcg-oom-kill-disable-and-oom-status.patch

How to test:
Create a cgroup A...
1. set memory.limit and memory.memsw.limit to be small value
2. echo 1 > /cgroup/A/memory.oom_control, this disables oom-kill.
3. run a program which must cause OOM.

A program executed in 3 will sleep by oom_waiqueue in memcg.
Then, how to wake it up is problem.

1. echo 0 > /cgroup/A/memory.oom_control (enable OOM-killer)
2. echo big mem > /cgroup/A/memory.memsw.limit_in_bytes(allow more swap)
etc..

Without the patch, a task in slept can not be waken up.

Changelog: 2010/06/04
Rebased onto mmotm-2010-06-03-16-36

Acked-by: Acked-by: Daisuke Nishimura <[email protected]>
Signed-off-by: KAMEZAWA Hiroyuki <[email protected]>
---
mm/memcontrol.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)

Index: mmotm-2.6.34-Jun6/mm/memcontrol.c
===================================================================
--- mmotm-2.6.34-Jun6.orig/mm/memcontrol.c
+++ mmotm-2.6.34-Jun6/mm/memcontrol.c
@@ -1370,7 +1370,7 @@ static void memcg_wakeup_oom(struct mem_

static void memcg_oom_recover(struct mem_cgroup *mem)
{
- if (mem->oom_kill_disable && atomic_read(&mem->oom_lock))
+ if (atomic_read(&mem->oom_lock))
memcg_wakeup_oom(mem);
}

@@ -3781,6 +3781,8 @@ static int mem_cgroup_oom_control_write(
return -EINVAL;
}
mem->oom_kill_disable = val;
+ if (!val)
+ memcg_oom_recover(mem);
cgroup_unlock();
return 0;
}

2010-06-04 08:12:19

by Kamezawa Hiroyuki

[permalink] [raw]
Subject: Re: [BUGFIX][PATCH] memcg fix wake up in oom wait queue

On Fri, 4 Jun 2010 11:58:20 +0900
KAMEZAWA Hiroyuki <[email protected]> wrote:

> Tested on mmotm-2010-06-03 and works well.
> ==
> From: KAMEZAWA Hiroyuki <[email protected]>
>
> OOM-waitqueue should be waken up when oom_disable is canceled.
> This is a fix for
> memcg-oom-kill-disable-and-oom-status.patch
>
Sorry, I found linux-2.6.git has the oom_control patch, so this patch
should be against linux-2.6.git. But maybe no HUNK, I think.

Regards,
-Kame