1
0
Fork 0

cgroup: replace cftype->trigger() with cftype->write()

cftype->trigger() is pointless.  It's trivial to ignore the input
buffer from a regular ->write() operation.  Convert all ->trigger()
users to ->write() and remove ->trigger().

This patch doesn't introduce any visible behavior changes.

Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Li Zefan <lizefan@huawei.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Michal Hocko <mhocko@suse.cz>
hifive-unleashed-5.1
Tejun Heo 2014-05-13 12:16:21 -04:00
parent 451af504df
commit 6770c64e5c
5 changed files with 35 additions and 43 deletions

View File

@ -499,14 +499,6 @@ struct cftype {
int (*write_s64)(struct cgroup_subsys_state *css, struct cftype *cft, int (*write_s64)(struct cgroup_subsys_state *css, struct cftype *cft,
s64 val); s64 val);
/*
* trigger() callback can be used to get some kick from the
* userspace, when the actual string written is not important
* at all. The private field can be used to determine the
* kick type for multiplexing.
*/
int (*trigger)(struct cgroup_subsys_state *css, unsigned int event);
/* /*
* write() is the generic write callback which maps directly to * write() is the generic write callback which maps directly to
* kernfs write operation and overrides all other operations. * kernfs write operation and overrides all other operations.

View File

@ -1034,8 +1034,7 @@ static umode_t cgroup_file_mode(const struct cftype *cft)
if (cft->read_u64 || cft->read_s64 || cft->seq_show) if (cft->read_u64 || cft->read_s64 || cft->seq_show)
mode |= S_IRUGO; mode |= S_IRUGO;
if (cft->write_u64 || cft->write_s64 || cft->write || if (cft->write_u64 || cft->write_s64 || cft->write)
cft->trigger)
mode |= S_IWUSR; mode |= S_IWUSR;
return mode; return mode;
@ -2750,8 +2749,6 @@ static ssize_t cgroup_file_write(struct kernfs_open_file *of, char *buf,
ret = kstrtoll(buf, 0, &v); ret = kstrtoll(buf, 0, &v);
if (!ret) if (!ret)
ret = cft->write_s64(css, cft, v); ret = cft->write_s64(css, cft, v);
} else if (cft->trigger) {
ret = cft->trigger(css, (unsigned int)cft->private);
} else { } else {
ret = -EINVAL; ret = -EINVAL;
} }

View File

@ -284,14 +284,14 @@ static ssize_t hugetlb_cgroup_write(struct kernfs_open_file *of,
return ret ?: nbytes; return ret ?: nbytes;
} }
static int hugetlb_cgroup_reset(struct cgroup_subsys_state *css, static ssize_t hugetlb_cgroup_reset(struct kernfs_open_file *of,
unsigned int event) char *buf, size_t nbytes, loff_t off)
{ {
int idx, name, ret = 0; int idx, name, ret = 0;
struct hugetlb_cgroup *h_cg = hugetlb_cgroup_from_css(css); struct hugetlb_cgroup *h_cg = hugetlb_cgroup_from_css(of_css(of));
idx = MEMFILE_IDX(event); idx = MEMFILE_IDX(of_cft(of)->private);
name = MEMFILE_ATTR(event); name = MEMFILE_ATTR(of_cft(of)->private);
switch (name) { switch (name) {
case RES_MAX_USAGE: case RES_MAX_USAGE:
@ -304,7 +304,7 @@ static int hugetlb_cgroup_reset(struct cgroup_subsys_state *css,
ret = -EINVAL; ret = -EINVAL;
break; break;
} }
return ret; return ret ?: nbytes;
} }
static char *mem_fmt(char *buf, int size, unsigned long hsize) static char *mem_fmt(char *buf, int size, unsigned long hsize)
@ -344,14 +344,14 @@ static void __init __hugetlb_cgroup_file_init(int idx)
cft = &h->cgroup_files[2]; cft = &h->cgroup_files[2];
snprintf(cft->name, MAX_CFTYPE_NAME, "%s.max_usage_in_bytes", buf); snprintf(cft->name, MAX_CFTYPE_NAME, "%s.max_usage_in_bytes", buf);
cft->private = MEMFILE_PRIVATE(idx, RES_MAX_USAGE); cft->private = MEMFILE_PRIVATE(idx, RES_MAX_USAGE);
cft->trigger = hugetlb_cgroup_reset; cft->write = hugetlb_cgroup_reset;
cft->read_u64 = hugetlb_cgroup_read_u64; cft->read_u64 = hugetlb_cgroup_read_u64;
/* Add the failcntfile */ /* Add the failcntfile */
cft = &h->cgroup_files[3]; cft = &h->cgroup_files[3];
snprintf(cft->name, MAX_CFTYPE_NAME, "%s.failcnt", buf); snprintf(cft->name, MAX_CFTYPE_NAME, "%s.failcnt", buf);
cft->private = MEMFILE_PRIVATE(idx, RES_FAILCNT); cft->private = MEMFILE_PRIVATE(idx, RES_FAILCNT);
cft->trigger = hugetlb_cgroup_reset; cft->write = hugetlb_cgroup_reset;
cft->read_u64 = hugetlb_cgroup_read_u64; cft->read_u64 = hugetlb_cgroup_read_u64;
/* NULL terminate the last cft */ /* NULL terminate the last cft */

View File

@ -4887,14 +4887,15 @@ static int mem_cgroup_force_empty(struct mem_cgroup *memcg)
return 0; return 0;
} }
static int mem_cgroup_force_empty_write(struct cgroup_subsys_state *css, static ssize_t mem_cgroup_force_empty_write(struct kernfs_open_file *of,
unsigned int event) char *buf, size_t nbytes,
loff_t off)
{ {
struct mem_cgroup *memcg = mem_cgroup_from_css(css); struct mem_cgroup *memcg = mem_cgroup_from_css(of_css(of));
if (mem_cgroup_is_root(memcg)) if (mem_cgroup_is_root(memcg))
return -EINVAL; return -EINVAL;
return mem_cgroup_force_empty(memcg); return mem_cgroup_force_empty(memcg) ?: nbytes;
} }
static u64 mem_cgroup_hierarchy_read(struct cgroup_subsys_state *css, static u64 mem_cgroup_hierarchy_read(struct cgroup_subsys_state *css,
@ -5220,14 +5221,15 @@ out:
*memsw_limit = min_memsw_limit; *memsw_limit = min_memsw_limit;
} }
static int mem_cgroup_reset(struct cgroup_subsys_state *css, unsigned int event) static ssize_t mem_cgroup_reset(struct kernfs_open_file *of, char *buf,
size_t nbytes, loff_t off)
{ {
struct mem_cgroup *memcg = mem_cgroup_from_css(css); struct mem_cgroup *memcg = mem_cgroup_from_css(of_css(of));
int name; int name;
enum res_type type; enum res_type type;
type = MEMFILE_TYPE(event); type = MEMFILE_TYPE(of_cft(of)->private);
name = MEMFILE_ATTR(event); name = MEMFILE_ATTR(of_cft(of)->private);
switch (name) { switch (name) {
case RES_MAX_USAGE: case RES_MAX_USAGE:
@ -5252,7 +5254,7 @@ static int mem_cgroup_reset(struct cgroup_subsys_state *css, unsigned int event)
break; break;
} }
return 0; return nbytes;
} }
static u64 mem_cgroup_move_charge_read(struct cgroup_subsys_state *css, static u64 mem_cgroup_move_charge_read(struct cgroup_subsys_state *css,
@ -6105,7 +6107,7 @@ static struct cftype mem_cgroup_files[] = {
{ {
.name = "max_usage_in_bytes", .name = "max_usage_in_bytes",
.private = MEMFILE_PRIVATE(_MEM, RES_MAX_USAGE), .private = MEMFILE_PRIVATE(_MEM, RES_MAX_USAGE),
.trigger = mem_cgroup_reset, .write = mem_cgroup_reset,
.read_u64 = mem_cgroup_read_u64, .read_u64 = mem_cgroup_read_u64,
}, },
{ {
@ -6123,7 +6125,7 @@ static struct cftype mem_cgroup_files[] = {
{ {
.name = "failcnt", .name = "failcnt",
.private = MEMFILE_PRIVATE(_MEM, RES_FAILCNT), .private = MEMFILE_PRIVATE(_MEM, RES_FAILCNT),
.trigger = mem_cgroup_reset, .write = mem_cgroup_reset,
.read_u64 = mem_cgroup_read_u64, .read_u64 = mem_cgroup_read_u64,
}, },
{ {
@ -6132,7 +6134,7 @@ static struct cftype mem_cgroup_files[] = {
}, },
{ {
.name = "force_empty", .name = "force_empty",
.trigger = mem_cgroup_force_empty_write, .write = mem_cgroup_force_empty_write,
}, },
{ {
.name = "use_hierarchy", .name = "use_hierarchy",
@ -6186,13 +6188,13 @@ static struct cftype mem_cgroup_files[] = {
{ {
.name = "kmem.failcnt", .name = "kmem.failcnt",
.private = MEMFILE_PRIVATE(_KMEM, RES_FAILCNT), .private = MEMFILE_PRIVATE(_KMEM, RES_FAILCNT),
.trigger = mem_cgroup_reset, .write = mem_cgroup_reset,
.read_u64 = mem_cgroup_read_u64, .read_u64 = mem_cgroup_read_u64,
}, },
{ {
.name = "kmem.max_usage_in_bytes", .name = "kmem.max_usage_in_bytes",
.private = MEMFILE_PRIVATE(_KMEM, RES_MAX_USAGE), .private = MEMFILE_PRIVATE(_KMEM, RES_MAX_USAGE),
.trigger = mem_cgroup_reset, .write = mem_cgroup_reset,
.read_u64 = mem_cgroup_read_u64, .read_u64 = mem_cgroup_read_u64,
}, },
#ifdef CONFIG_SLABINFO #ifdef CONFIG_SLABINFO
@ -6215,7 +6217,7 @@ static struct cftype memsw_cgroup_files[] = {
{ {
.name = "memsw.max_usage_in_bytes", .name = "memsw.max_usage_in_bytes",
.private = MEMFILE_PRIVATE(_MEMSWAP, RES_MAX_USAGE), .private = MEMFILE_PRIVATE(_MEMSWAP, RES_MAX_USAGE),
.trigger = mem_cgroup_reset, .write = mem_cgroup_reset,
.read_u64 = mem_cgroup_read_u64, .read_u64 = mem_cgroup_read_u64,
}, },
{ {
@ -6227,7 +6229,7 @@ static struct cftype memsw_cgroup_files[] = {
{ {
.name = "memsw.failcnt", .name = "memsw.failcnt",
.private = MEMFILE_PRIVATE(_MEMSWAP, RES_FAILCNT), .private = MEMFILE_PRIVATE(_MEMSWAP, RES_FAILCNT),
.trigger = mem_cgroup_reset, .write = mem_cgroup_reset,
.read_u64 = mem_cgroup_read_u64, .read_u64 = mem_cgroup_read_u64,
}, },
{ }, /* terminate */ { }, /* terminate */

View File

@ -170,17 +170,18 @@ static u64 tcp_cgroup_read(struct cgroup_subsys_state *css, struct cftype *cft)
return val; return val;
} }
static int tcp_cgroup_reset(struct cgroup_subsys_state *css, unsigned int event) static ssize_t tcp_cgroup_reset(struct kernfs_open_file *of,
char *buf, size_t nbytes, loff_t off)
{ {
struct mem_cgroup *memcg; struct mem_cgroup *memcg;
struct cg_proto *cg_proto; struct cg_proto *cg_proto;
memcg = mem_cgroup_from_css(css); memcg = mem_cgroup_from_css(of_css(of));
cg_proto = tcp_prot.proto_cgroup(memcg); cg_proto = tcp_prot.proto_cgroup(memcg);
if (!cg_proto) if (!cg_proto)
return 0; return nbytes;
switch (event) { switch (of_cft(of)->private) {
case RES_MAX_USAGE: case RES_MAX_USAGE:
res_counter_reset_max(&cg_proto->memory_allocated); res_counter_reset_max(&cg_proto->memory_allocated);
break; break;
@ -189,7 +190,7 @@ static int tcp_cgroup_reset(struct cgroup_subsys_state *css, unsigned int event)
break; break;
} }
return 0; return nbytes;
} }
static struct cftype tcp_files[] = { static struct cftype tcp_files[] = {
@ -207,13 +208,13 @@ static struct cftype tcp_files[] = {
{ {
.name = "kmem.tcp.failcnt", .name = "kmem.tcp.failcnt",
.private = RES_FAILCNT, .private = RES_FAILCNT,
.trigger = tcp_cgroup_reset, .write = tcp_cgroup_reset,
.read_u64 = tcp_cgroup_read, .read_u64 = tcp_cgroup_read,
}, },
{ {
.name = "kmem.tcp.max_usage_in_bytes", .name = "kmem.tcp.max_usage_in_bytes",
.private = RES_MAX_USAGE, .private = RES_MAX_USAGE,
.trigger = tcp_cgroup_reset, .write = tcp_cgroup_reset,
.read_u64 = tcp_cgroup_read, .read_u64 = tcp_cgroup_read,
}, },
{ } /* terminate */ { } /* terminate */