diff options
author | Paul Menage <menage@google.com> | 2008-07-25 04:47:04 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-07-25 13:53:36 -0400 |
commit | 856c13aa1ff6136c1968414fdea5938ea9d5ebf2 (patch) | |
tree | deee908f253c77cbcb868a915e45bfb2ed99383c /mm/memcontrol.c | |
parent | f92523e3a7861f5dbd76021e0719a35fe8771f2d (diff) |
cgroup files: convert res_counter_write() to be a cgroups write_string() handler
Currently res_counter_write() is a raw file handler even though it's
ultimately taking a number, since in some cases it wants to
pre-process the string when converting it to a number.
This patch converts res_counter_write() from a raw file handler to a
write_string() handler; this allows some of the boilerplate
copying/locking/checking to be removed, and simplies the cleanup path,
since these functions are now performed by the cgroups framework.
[lizf@cn.fujitsu.com: build fix]
Signed-off-by: Paul Menage <menage@google.com>
Cc: Paul Jackson <pj@sgi.com>
Cc: Pavel Emelyanov <xemul@openvz.org>
Cc: Balbir Singh <balbir@in.ibm.com>
Cc: Serge Hallyn <serue@us.ibm.com>
Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/memcontrol.c')
-rw-r--r-- | mm/memcontrol.c | 24 |
1 files changed, 5 insertions, 19 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index e46451e1d9b7..7385d58fb061 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -838,32 +838,18 @@ out: | |||
838 | return ret; | 838 | return ret; |
839 | } | 839 | } |
840 | 840 | ||
841 | static int mem_cgroup_write_strategy(char *buf, unsigned long long *tmp) | ||
842 | { | ||
843 | *tmp = memparse(buf, &buf); | ||
844 | if (*buf != '\0') | ||
845 | return -EINVAL; | ||
846 | |||
847 | /* | ||
848 | * Round up the value to the closest page size | ||
849 | */ | ||
850 | *tmp = ((*tmp + PAGE_SIZE - 1) >> PAGE_SHIFT) << PAGE_SHIFT; | ||
851 | return 0; | ||
852 | } | ||
853 | |||
854 | static u64 mem_cgroup_read(struct cgroup *cont, struct cftype *cft) | 841 | static u64 mem_cgroup_read(struct cgroup *cont, struct cftype *cft) |
855 | { | 842 | { |
856 | return res_counter_read_u64(&mem_cgroup_from_cont(cont)->res, | 843 | return res_counter_read_u64(&mem_cgroup_from_cont(cont)->res, |
857 | cft->private); | 844 | cft->private); |
858 | } | 845 | } |
859 | 846 | ||
860 | static ssize_t mem_cgroup_write(struct cgroup *cont, struct cftype *cft, | 847 | static int mem_cgroup_write(struct cgroup *cont, struct cftype *cft, |
861 | struct file *file, const char __user *userbuf, | 848 | const char *buffer) |
862 | size_t nbytes, loff_t *ppos) | ||
863 | { | 849 | { |
864 | return res_counter_write(&mem_cgroup_from_cont(cont)->res, | 850 | return res_counter_write(&mem_cgroup_from_cont(cont)->res, |
865 | cft->private, userbuf, nbytes, ppos, | 851 | cft->private, buffer, |
866 | mem_cgroup_write_strategy); | 852 | res_counter_memparse_write_strategy); |
867 | } | 853 | } |
868 | 854 | ||
869 | static int mem_cgroup_reset(struct cgroup *cont, unsigned int event) | 855 | static int mem_cgroup_reset(struct cgroup *cont, unsigned int event) |
@@ -940,7 +926,7 @@ static struct cftype mem_cgroup_files[] = { | |||
940 | { | 926 | { |
941 | .name = "limit_in_bytes", | 927 | .name = "limit_in_bytes", |
942 | .private = RES_LIMIT, | 928 | .private = RES_LIMIT, |
943 | .write = mem_cgroup_write, | 929 | .write_string = mem_cgroup_write, |
944 | .read_u64 = mem_cgroup_read, | 930 | .read_u64 = mem_cgroup_read, |
945 | }, | 931 | }, |
946 | { | 932 | { |