2009-01-14 08:11:57

by Li Zefan

[permalink] [raw]
Subject: [PATCH] memcg: fix return value of mem_cgroup_hierarchy_write()

When there are sub-dirs, writing to memory.use_hierarchy returns -EBUSY,
this doesn't seem to fit the meaning of EBUSY, and is inconsistent with
memory.swappiness, which returns -EINVAL in this case.

Signed-off-by: Li Zefan <[email protected]>
---
mm/memcontrol.c | 10 +++++-----
1 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index bc8f101..2497f7d 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -1760,6 +1760,9 @@ static int mem_cgroup_hierarchy_write(struct cgroup *cont, struct cftype *cft,
struct cgroup *parent = cont->parent;
struct mem_cgroup *parent_mem = NULL;

+ if (val != 0 && val != 1)
+ return -EINVAL;
+
if (parent)
parent_mem = mem_cgroup_from_cont(parent);

@@ -1773,12 +1776,9 @@ static int mem_cgroup_hierarchy_write(struct cgroup *cont, struct cftype *cft,
* set if there are no children.
*/
if ((!parent_mem || !parent_mem->use_hierarchy) &&
- (val == 1 || val == 0)) {
- if (list_empty(&cont->children))
+ list_empty(&cont->children))
mem->use_hierarchy = val;
- else
- retval = -EBUSY;
- } else
+ else
retval = -EINVAL;
cgroup_unlock();

--
1.5.4.rc3


2009-01-14 08:22:55

by Kamezawa Hiroyuki

[permalink] [raw]
Subject: Re: [PATCH] memcg: fix return value of mem_cgroup_hierarchy_write()

On Wed, 14 Jan 2009 16:10:52 +0800
Li Zefan <[email protected]> wrote:

> When there are sub-dirs, writing to memory.use_hierarchy returns -EBUSY,
> this doesn't seem to fit the meaning of EBUSY, and is inconsistent with
> memory.swappiness, which returns -EINVAL in this case.
>

Hmm...I'm not sure what error code is the best.

In usual, -EINVAL means parameter to write() is bad. In this case, it isn't.

Considering that, -EBUSY seems ok at returning error because of children.
How about change swappiness to return -EBUSY ?

Thanks,
-Kame






> Signed-off-by: Li Zefan <[email protected]>
> ---
> mm/memcontrol.c | 10 +++++-----
> 1 files changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> index bc8f101..2497f7d 100644
> --- a/mm/memcontrol.c
> +++ b/mm/memcontrol.c
> @@ -1760,6 +1760,9 @@ static int mem_cgroup_hierarchy_write(struct cgroup *cont, struct cftype *cft,
> struct cgroup *parent = cont->parent;
> struct mem_cgroup *parent_mem = NULL;
>
> + if (val != 0 && val != 1)
> + return -EINVAL;
> +
> if (parent)
> parent_mem = mem_cgroup_from_cont(parent);
>
> @@ -1773,12 +1776,9 @@ static int mem_cgroup_hierarchy_write(struct cgroup *cont, struct cftype *cft,
> * set if there are no children.
> */
> if ((!parent_mem || !parent_mem->use_hierarchy) &&
> - (val == 1 || val == 0)) {
> - if (list_empty(&cont->children))
> + list_empty(&cont->children))
> mem->use_hierarchy = val;
> - else
> - retval = -EBUSY;
> - } else
> + else
> retval = -EINVAL;
> cgroup_unlock();
>
> --
> 1.5.4.rc3
>

2009-01-14 08:31:50

by Daisuke Nishimura

[permalink] [raw]
Subject: Re: [PATCH] memcg: fix return value of mem_cgroup_hierarchy_write()

On Wed, 14 Jan 2009 16:10:52 +0800, Li Zefan <[email protected]> wrote:
> When there are sub-dirs, writing to memory.use_hierarchy returns -EBUSY,
> this doesn't seem to fit the meaning of EBUSY, and is inconsistent with
> memory.swappiness, which returns -EINVAL in this case.
>
I also think -EBUSY is not so bad in this case.

Thanks,
Daisuke Nishimura.

> Signed-off-by: Li Zefan <[email protected]>
> ---
> mm/memcontrol.c | 10 +++++-----
> 1 files changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> index bc8f101..2497f7d 100644
> --- a/mm/memcontrol.c
> +++ b/mm/memcontrol.c
> @@ -1760,6 +1760,9 @@ static int mem_cgroup_hierarchy_write(struct cgroup *cont, struct cftype *cft,
> struct cgroup *parent = cont->parent;
> struct mem_cgroup *parent_mem = NULL;
>
> + if (val != 0 && val != 1)
> + return -EINVAL;
> +
> if (parent)
> parent_mem = mem_cgroup_from_cont(parent);
>
> @@ -1773,12 +1776,9 @@ static int mem_cgroup_hierarchy_write(struct cgroup *cont, struct cftype *cft,
> * set if there are no children.
> */
> if ((!parent_mem || !parent_mem->use_hierarchy) &&
> - (val == 1 || val == 0)) {
> - if (list_empty(&cont->children))
> + list_empty(&cont->children))
> mem->use_hierarchy = val;
> - else
> - retval = -EBUSY;
> - } else
> + else
> retval = -EINVAL;
> cgroup_unlock();
>
> --
> 1.5.4.rc3

2009-01-14 08:38:51

by Balbir Singh

[permalink] [raw]
Subject: Re: [PATCH] memcg: fix return value of mem_cgroup_hierarchy_write()

* Li Zefan <[email protected]> [2009-01-14 16:10:52]:

> When there are sub-dirs, writing to memory.use_hierarchy returns -EBUSY,
> this doesn't seem to fit the meaning of EBUSY, and is inconsistent with
> memory.swappiness, which returns -EINVAL in this case.
>
> Signed-off-by: Li Zefan <[email protected]>

The patch does much more than the changelog says. The reason for EBUSY
is that the group is in use due to children or existing references and
tasks. I think EBUSY is the correct error code to return.

--
Balbir

2009-01-14 08:46:48

by Li Zefan

[permalink] [raw]
Subject: Re: [PATCH] memcg: fix return value of mem_cgroup_hierarchy_write()

Balbir Singh wrote:
> * Li Zefan <[email protected]> [2009-01-14 16:10:52]:
>
>> When there are sub-dirs, writing to memory.use_hierarchy returns -EBUSY,
>> this doesn't seem to fit the meaning of EBUSY, and is inconsistent with
>> memory.swappiness, which returns -EINVAL in this case.
>>
>> Signed-off-by: Li Zefan <[email protected]>
>
> The patch does much more than the changelog says. The reason for EBUSY
> is that the group is in use due to children or existing references and
> tasks. I think EBUSY is the correct error code to return.
>

Sounds reasonable for me. Thanks.

Regards
Li Zefan