Messages in this thread Patch in this message | | | From | Tejun Heo <> | Subject | [PATCH 2/3] netcls_cgroup: introduce cgroup_cls_state->is_local | Date | Fri, 16 Nov 2012 19:31:01 -0800 |
| |
cs->is_local will be used to indicate whether the cgroup has its own configuration or inherited from the parent. It's set when classid is configured by writing a positive value to cgroup file "net_cls.classid" and cleared when a negative value is written.
is_local is visible to userland via cgroup file "net_cls.is_local" so that userland can know whether a cgroup has its config or not.
This patch doesn't yet change hierarchy behavior. The next patch will use is_local to implement proper hierarchy.
Signed-off-by: Tejun Heo <tj@kernel.org> --- include/net/cls_cgroup.h | 1 + net/sched/cls_cgroup.c | 23 ++++++++++++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-)
diff --git a/include/net/cls_cgroup.h b/include/net/cls_cgroup.h index b6a6eeb..5759d98 100644 --- a/include/net/cls_cgroup.h +++ b/include/net/cls_cgroup.h @@ -22,6 +22,7 @@ struct cgroup_cls_state { struct cgroup_subsys_state css; u32 classid; + bool is_local; /* class id is explicitly configured for this cgroup */ }; extern void sock_update_classid(struct sock *sk); diff --git a/net/sched/cls_cgroup.c b/net/sched/cls_cgroup.c index 80a80c4..6e3ef64 100644 --- a/net/sched/cls_cgroup.c +++ b/net/sched/cls_cgroup.c @@ -70,19 +70,36 @@ static u64 read_classid(struct cgroup *cgrp, struct cftype *cft) return cgrp_cls_state(cgrp)->classid; } -static int write_classid(struct cgroup *cgrp, struct cftype *cft, u64 value) +static int write_classid(struct cgroup *cgrp, struct cftype *cft, + const char *buf) { + struct cgroup_cls_state *cs = cgrp_cls_state(cgrp); + s64 v; + + if (sscanf(buf, "%lld", &v) != 1) + return -EINVAL; + mutex_lock(&netcls_mutex); - cgrp_cls_state(cgrp)->classid = (u32) value; + cs->classid = clamp_val(v, 0, UINT_MAX); + cs->is_local = v >= 0; mutex_unlock(&netcls_mutex); return 0; } +static u64 read_is_local(struct cgroup *cgrp, struct cftype *cft) +{ + return cgrp_cls_state(cgrp)->is_local; +} + static struct cftype ss_files[] = { { .name = "classid", .read_u64 = read_classid, - .write_u64 = write_classid, + .write_string = write_classid, + }, + { + .name = "is_local", + .read_u64 = read_is_local, }, { } /* terminate */ }; -- 1.7.11.7
| |