diff options
author | Tejun Heo <tj@kernel.org> | 2015-12-07 10:09:03 -0500 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2015-12-07 10:09:03 -0500 |
commit | 0b98f0c04245877ae0b625a7f0aa55b8ff98e0c4 (patch) | |
tree | 486ebe0d76217a4f7781e28fbd96facb0b66f9da /net/core/netclassid_cgroup.c | |
parent | 67cde9c4938945b9510730c64e68d2f1dd7bc0aa (diff) | |
parent | 527e9316f8ec44bd53d90fb9f611fa7ffff52bb9 (diff) |
Merge branch 'master' into for-4.4-fixes
The following commit which went into mainline through networking tree
3b13758f51de ("cgroups: Allow dynamically changing net_classid")
conflicts in net/core/netclassid_cgroup.c with the following pending
fix in cgroup/for-4.4-fixes.
1f7dd3e5a6e4 ("cgroup: fix handling of multi-destination migration from subtree_control enabling")
The former separates out update_classid() from cgrp_attach() and
updates it to walk all fds of all tasks in the target css so that it
can be used from both migration and config change paths. The latter
drops @css from cgrp_attach().
Resolve the conflict by making cgrp_attach() call update_classid()
with the css from the first task. We can revive @tset walking in
cgrp_attach() but given that net_cls is v1 only where there always is
only one target css during migration, this is fine.
Signed-off-by: Tejun Heo <tj@kernel.org>
Reported-by: Stephen Rothwell <sfr@canb.auug.org.au>
Cc: Nina Schiff <ninasc@fb.com>
Diffstat (limited to 'net/core/netclassid_cgroup.c')
-rw-r--r-- | net/core/netclassid_cgroup.c | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/net/core/netclassid_cgroup.c b/net/core/netclassid_cgroup.c index 81cb3c72efe8..d9ee8d08a3a6 100644 --- a/net/core/netclassid_cgroup.c +++ b/net/core/netclassid_cgroup.c | |||
@@ -56,7 +56,7 @@ static void cgrp_css_free(struct cgroup_subsys_state *css) | |||
56 | kfree(css_cls_state(css)); | 56 | kfree(css_cls_state(css)); |
57 | } | 57 | } |
58 | 58 | ||
59 | static int update_classid(const void *v, struct file *file, unsigned n) | 59 | static int update_classid_sock(const void *v, struct file *file, unsigned n) |
60 | { | 60 | { |
61 | int err; | 61 | int err; |
62 | struct socket *sock = sock_from_file(file, &err); | 62 | struct socket *sock = sock_from_file(file, &err); |
@@ -67,19 +67,27 @@ static int update_classid(const void *v, struct file *file, unsigned n) | |||
67 | return 0; | 67 | return 0; |
68 | } | 68 | } |
69 | 69 | ||
70 | static void cgrp_attach(struct cgroup_taskset *tset) | 70 | static void update_classid(struct cgroup_subsys_state *css, void *v) |
71 | { | 71 | { |
72 | struct css_task_iter it; | ||
72 | struct task_struct *p; | 73 | struct task_struct *p; |
73 | struct cgroup_subsys_state *css; | ||
74 | |||
75 | cgroup_taskset_for_each(p, css, tset) { | ||
76 | struct cgroup_cls_state *cs = css_cls_state(css); | ||
77 | void *v = (void *)(unsigned long)cs->classid; | ||
78 | 74 | ||
75 | css_task_iter_start(css, &it); | ||
76 | while ((p = css_task_iter_next(&it))) { | ||
79 | task_lock(p); | 77 | task_lock(p); |
80 | iterate_fd(p->files, 0, update_classid, v); | 78 | iterate_fd(p->files, 0, update_classid_sock, v); |
81 | task_unlock(p); | 79 | task_unlock(p); |
82 | } | 80 | } |
81 | css_task_iter_end(&it); | ||
82 | } | ||
83 | |||
84 | static void cgrp_attach(struct cgroup_taskset *tset) | ||
85 | { | ||
86 | struct cgroup_subsys_state *css; | ||
87 | |||
88 | cgroup_taskset_first(tset, &css); | ||
89 | update_classid(css, | ||
90 | (void *)(unsigned long)css_cls_state(css)->classid); | ||
83 | } | 91 | } |
84 | 92 | ||
85 | static u64 read_classid(struct cgroup_subsys_state *css, struct cftype *cft) | 93 | static u64 read_classid(struct cgroup_subsys_state *css, struct cftype *cft) |
@@ -90,8 +98,11 @@ static u64 read_classid(struct cgroup_subsys_state *css, struct cftype *cft) | |||
90 | static int write_classid(struct cgroup_subsys_state *css, struct cftype *cft, | 98 | static int write_classid(struct cgroup_subsys_state *css, struct cftype *cft, |
91 | u64 value) | 99 | u64 value) |
92 | { | 100 | { |
93 | css_cls_state(css)->classid = (u32) value; | 101 | struct cgroup_cls_state *cs = css_cls_state(css); |
102 | |||
103 | cs->classid = (u32)value; | ||
94 | 104 | ||
105 | update_classid(css, (void *)(unsigned long)cs->classid); | ||
95 | return 0; | 106 | return 0; |
96 | } | 107 | } |
97 | 108 | ||