diff options
author | Tejun Heo <tj@kernel.org> | 2014-05-13 12:16:21 -0400 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2014-05-13 12:16:21 -0400 |
commit | 451af504df0c62f695a69b83c250486e77c66378 (patch) | |
tree | f89879cf3f88e9da346d8bd3fa1ae192a280d772 /mm/memcontrol.c | |
parent | b41686401e501430ffe93b575ef7959d2ecc6f2e (diff) |
cgroup: replace cftype->write_string() with cftype->write()
Convert all cftype->write_string() users to the new cftype->write()
which maps directly to kernfs write operation and has full access to
kernfs and cgroup contexts. The conversions are mostly mechanical.
* @css and @cft are accessed using of_css() and of_cft() accessors
respectively instead of being specified as arguments.
* Should return @nbytes on success instead of 0.
* @buf is not trimmed automatically. Trim if necessary. Note that
blkcg and netprio don't need this as the parsers already handle
whitespaces.
cftype->write_string() has no user left after the conversions and
removed.
While at it, remove unnecessary local variable @p in
cgroup_subtree_control_write() and stale comment about
CGROUP_LOCAL_BUFFER_SIZE in cgroup_freezer.c.
This patch doesn't introduce any visible behavior changes.
v2: netprio was missing from conversion. Converted.
Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Aristeu Rozanski <arozansk@redhat.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
Acked-by: Li Zefan <lizefan@huawei.com>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Michal Hocko <mhocko@suse.cz>
Cc: Neil Horman <nhorman@tuxdriver.com>
Cc: "David S. Miller" <davem@davemloft.net>
Diffstat (limited to 'mm/memcontrol.c')
-rw-r--r-- | mm/memcontrol.c | 46 |
1 files changed, 25 insertions, 21 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 5cf3246314a2..7098a43f7447 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -5143,17 +5143,18 @@ static int memcg_update_kmem_limit(struct mem_cgroup *memcg, | |||
5143 | * The user of this function is... | 5143 | * The user of this function is... |
5144 | * RES_LIMIT. | 5144 | * RES_LIMIT. |
5145 | */ | 5145 | */ |
5146 | static int mem_cgroup_write(struct cgroup_subsys_state *css, struct cftype *cft, | 5146 | static ssize_t mem_cgroup_write(struct kernfs_open_file *of, |
5147 | char *buffer) | 5147 | char *buf, size_t nbytes, loff_t off) |
5148 | { | 5148 | { |
5149 | struct mem_cgroup *memcg = mem_cgroup_from_css(css); | 5149 | struct mem_cgroup *memcg = mem_cgroup_from_css(of_css(of)); |
5150 | enum res_type type; | 5150 | enum res_type type; |
5151 | int name; | 5151 | int name; |
5152 | unsigned long long val; | 5152 | unsigned long long val; |
5153 | int ret; | 5153 | int ret; |
5154 | 5154 | ||
5155 | type = MEMFILE_TYPE(cft->private); | 5155 | buf = strstrip(buf); |
5156 | name = MEMFILE_ATTR(cft->private); | 5156 | type = MEMFILE_TYPE(of_cft(of)->private); |
5157 | name = MEMFILE_ATTR(of_cft(of)->private); | ||
5157 | 5158 | ||
5158 | switch (name) { | 5159 | switch (name) { |
5159 | case RES_LIMIT: | 5160 | case RES_LIMIT: |
@@ -5162,7 +5163,7 @@ static int mem_cgroup_write(struct cgroup_subsys_state *css, struct cftype *cft, | |||
5162 | break; | 5163 | break; |
5163 | } | 5164 | } |
5164 | /* This function does all necessary parse...reuse it */ | 5165 | /* This function does all necessary parse...reuse it */ |
5165 | ret = res_counter_memparse_write_strategy(buffer, &val); | 5166 | ret = res_counter_memparse_write_strategy(buf, &val); |
5166 | if (ret) | 5167 | if (ret) |
5167 | break; | 5168 | break; |
5168 | if (type == _MEM) | 5169 | if (type == _MEM) |
@@ -5175,7 +5176,7 @@ static int mem_cgroup_write(struct cgroup_subsys_state *css, struct cftype *cft, | |||
5175 | return -EINVAL; | 5176 | return -EINVAL; |
5176 | break; | 5177 | break; |
5177 | case RES_SOFT_LIMIT: | 5178 | case RES_SOFT_LIMIT: |
5178 | ret = res_counter_memparse_write_strategy(buffer, &val); | 5179 | ret = res_counter_memparse_write_strategy(buf, &val); |
5179 | if (ret) | 5180 | if (ret) |
5180 | break; | 5181 | break; |
5181 | /* | 5182 | /* |
@@ -5192,7 +5193,7 @@ static int mem_cgroup_write(struct cgroup_subsys_state *css, struct cftype *cft, | |||
5192 | ret = -EINVAL; /* should be BUG() ? */ | 5193 | ret = -EINVAL; /* should be BUG() ? */ |
5193 | break; | 5194 | break; |
5194 | } | 5195 | } |
5195 | return ret; | 5196 | return ret ?: nbytes; |
5196 | } | 5197 | } |
5197 | 5198 | ||
5198 | static void memcg_get_hierarchical_limit(struct mem_cgroup *memcg, | 5199 | static void memcg_get_hierarchical_limit(struct mem_cgroup *memcg, |
@@ -5964,9 +5965,10 @@ static void memcg_event_ptable_queue_proc(struct file *file, | |||
5964 | * Input must be in format '<event_fd> <control_fd> <args>'. | 5965 | * Input must be in format '<event_fd> <control_fd> <args>'. |
5965 | * Interpretation of args is defined by control file implementation. | 5966 | * Interpretation of args is defined by control file implementation. |
5966 | */ | 5967 | */ |
5967 | static int memcg_write_event_control(struct cgroup_subsys_state *css, | 5968 | static ssize_t memcg_write_event_control(struct kernfs_open_file *of, |
5968 | struct cftype *cft, char *buffer) | 5969 | char *buf, size_t nbytes, loff_t off) |
5969 | { | 5970 | { |
5971 | struct cgroup_subsys_state *css = of_css(of); | ||
5970 | struct mem_cgroup *memcg = mem_cgroup_from_css(css); | 5972 | struct mem_cgroup *memcg = mem_cgroup_from_css(css); |
5971 | struct mem_cgroup_event *event; | 5973 | struct mem_cgroup_event *event; |
5972 | struct cgroup_subsys_state *cfile_css; | 5974 | struct cgroup_subsys_state *cfile_css; |
@@ -5977,15 +5979,17 @@ static int memcg_write_event_control(struct cgroup_subsys_state *css, | |||
5977 | char *endp; | 5979 | char *endp; |
5978 | int ret; | 5980 | int ret; |
5979 | 5981 | ||
5980 | efd = simple_strtoul(buffer, &endp, 10); | 5982 | buf = strstrip(buf); |
5983 | |||
5984 | efd = simple_strtoul(buf, &endp, 10); | ||
5981 | if (*endp != ' ') | 5985 | if (*endp != ' ') |
5982 | return -EINVAL; | 5986 | return -EINVAL; |
5983 | buffer = endp + 1; | 5987 | buf = endp + 1; |
5984 | 5988 | ||
5985 | cfd = simple_strtoul(buffer, &endp, 10); | 5989 | cfd = simple_strtoul(buf, &endp, 10); |
5986 | if ((*endp != ' ') && (*endp != '\0')) | 5990 | if ((*endp != ' ') && (*endp != '\0')) |
5987 | return -EINVAL; | 5991 | return -EINVAL; |
5988 | buffer = endp + 1; | 5992 | buf = endp + 1; |
5989 | 5993 | ||
5990 | event = kzalloc(sizeof(*event), GFP_KERNEL); | 5994 | event = kzalloc(sizeof(*event), GFP_KERNEL); |
5991 | if (!event) | 5995 | if (!event) |
@@ -6063,7 +6067,7 @@ static int memcg_write_event_control(struct cgroup_subsys_state *css, | |||
6063 | goto out_put_cfile; | 6067 | goto out_put_cfile; |
6064 | } | 6068 | } |
6065 | 6069 | ||
6066 | ret = event->register_event(memcg, event->eventfd, buffer); | 6070 | ret = event->register_event(memcg, event->eventfd, buf); |
6067 | if (ret) | 6071 | if (ret) |
6068 | goto out_put_css; | 6072 | goto out_put_css; |
6069 | 6073 | ||
@@ -6076,7 +6080,7 @@ static int memcg_write_event_control(struct cgroup_subsys_state *css, | |||
6076 | fdput(cfile); | 6080 | fdput(cfile); |
6077 | fdput(efile); | 6081 | fdput(efile); |
6078 | 6082 | ||
6079 | return 0; | 6083 | return nbytes; |
6080 | 6084 | ||
6081 | out_put_css: | 6085 | out_put_css: |
6082 | css_put(css); | 6086 | css_put(css); |
@@ -6107,13 +6111,13 @@ static struct cftype mem_cgroup_files[] = { | |||
6107 | { | 6111 | { |
6108 | .name = "limit_in_bytes", | 6112 | .name = "limit_in_bytes", |
6109 | .private = MEMFILE_PRIVATE(_MEM, RES_LIMIT), | 6113 | .private = MEMFILE_PRIVATE(_MEM, RES_LIMIT), |
6110 | .write_string = mem_cgroup_write, | 6114 | .write = mem_cgroup_write, |
6111 | .read_u64 = mem_cgroup_read_u64, | 6115 | .read_u64 = mem_cgroup_read_u64, |
6112 | }, | 6116 | }, |
6113 | { | 6117 | { |
6114 | .name = "soft_limit_in_bytes", | 6118 | .name = "soft_limit_in_bytes", |
6115 | .private = MEMFILE_PRIVATE(_MEM, RES_SOFT_LIMIT), | 6119 | .private = MEMFILE_PRIVATE(_MEM, RES_SOFT_LIMIT), |
6116 | .write_string = mem_cgroup_write, | 6120 | .write = mem_cgroup_write, |
6117 | .read_u64 = mem_cgroup_read_u64, | 6121 | .read_u64 = mem_cgroup_read_u64, |
6118 | }, | 6122 | }, |
6119 | { | 6123 | { |
@@ -6138,7 +6142,7 @@ static struct cftype mem_cgroup_files[] = { | |||
6138 | }, | 6142 | }, |
6139 | { | 6143 | { |
6140 | .name = "cgroup.event_control", /* XXX: for compat */ | 6144 | .name = "cgroup.event_control", /* XXX: for compat */ |
6141 | .write_string = memcg_write_event_control, | 6145 | .write = memcg_write_event_control, |
6142 | .flags = CFTYPE_NO_PREFIX, | 6146 | .flags = CFTYPE_NO_PREFIX, |
6143 | .mode = S_IWUGO, | 6147 | .mode = S_IWUGO, |
6144 | }, | 6148 | }, |
@@ -6171,7 +6175,7 @@ static struct cftype mem_cgroup_files[] = { | |||
6171 | { | 6175 | { |
6172 | .name = "kmem.limit_in_bytes", | 6176 | .name = "kmem.limit_in_bytes", |
6173 | .private = MEMFILE_PRIVATE(_KMEM, RES_LIMIT), | 6177 | .private = MEMFILE_PRIVATE(_KMEM, RES_LIMIT), |
6174 | .write_string = mem_cgroup_write, | 6178 | .write = mem_cgroup_write, |
6175 | .read_u64 = mem_cgroup_read_u64, | 6179 | .read_u64 = mem_cgroup_read_u64, |
6176 | }, | 6180 | }, |
6177 | { | 6181 | { |
@@ -6217,7 +6221,7 @@ static struct cftype memsw_cgroup_files[] = { | |||
6217 | { | 6221 | { |
6218 | .name = "memsw.limit_in_bytes", | 6222 | .name = "memsw.limit_in_bytes", |
6219 | .private = MEMFILE_PRIVATE(_MEMSWAP, RES_LIMIT), | 6223 | .private = MEMFILE_PRIVATE(_MEMSWAP, RES_LIMIT), |
6220 | .write_string = mem_cgroup_write, | 6224 | .write = mem_cgroup_write, |
6221 | .read_u64 = mem_cgroup_read_u64, | 6225 | .read_u64 = mem_cgroup_read_u64, |
6222 | }, | 6226 | }, |
6223 | { | 6227 | { |