mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-05 13:51:52 +00:00
cgroup: Fix cgroup_subsys::exit callback
Make the ::exit method act like ::attach, it is after all very nearly the same thing. The bug had no effect on correctness - fixing it is an optimization for the scheduler. Also, later perf-cgroups patches rely on it. Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Acked-by: Paul Menage <menage@google.com> LKML-Reference: <1297160655.13327.92.camel@laptop> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
b00560f2d4
commit
d41d5a0163
3 changed files with 22 additions and 18 deletions
|
@ -474,7 +474,8 @@ struct cgroup_subsys {
|
||||||
struct cgroup *old_cgrp, struct task_struct *tsk,
|
struct cgroup *old_cgrp, struct task_struct *tsk,
|
||||||
bool threadgroup);
|
bool threadgroup);
|
||||||
void (*fork)(struct cgroup_subsys *ss, struct task_struct *task);
|
void (*fork)(struct cgroup_subsys *ss, struct task_struct *task);
|
||||||
void (*exit)(struct cgroup_subsys *ss, struct task_struct *task);
|
void (*exit)(struct cgroup_subsys *ss, struct cgroup *cgrp,
|
||||||
|
struct cgroup *old_cgrp, struct task_struct *task);
|
||||||
int (*populate)(struct cgroup_subsys *ss,
|
int (*populate)(struct cgroup_subsys *ss,
|
||||||
struct cgroup *cgrp);
|
struct cgroup *cgrp);
|
||||||
void (*post_clone)(struct cgroup_subsys *ss, struct cgroup *cgrp);
|
void (*post_clone)(struct cgroup_subsys *ss, struct cgroup *cgrp);
|
||||||
|
|
|
@ -4230,20 +4230,8 @@ void cgroup_post_fork(struct task_struct *child)
|
||||||
*/
|
*/
|
||||||
void cgroup_exit(struct task_struct *tsk, int run_callbacks)
|
void cgroup_exit(struct task_struct *tsk, int run_callbacks)
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
struct css_set *cg;
|
struct css_set *cg;
|
||||||
|
int i;
|
||||||
if (run_callbacks && need_forkexit_callback) {
|
|
||||||
/*
|
|
||||||
* modular subsystems can't use callbacks, so no need to lock
|
|
||||||
* the subsys array
|
|
||||||
*/
|
|
||||||
for (i = 0; i < CGROUP_BUILTIN_SUBSYS_COUNT; i++) {
|
|
||||||
struct cgroup_subsys *ss = subsys[i];
|
|
||||||
if (ss->exit)
|
|
||||||
ss->exit(ss, tsk);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Unlink from the css_set task list if necessary.
|
* Unlink from the css_set task list if necessary.
|
||||||
|
@ -4261,7 +4249,24 @@ void cgroup_exit(struct task_struct *tsk, int run_callbacks)
|
||||||
task_lock(tsk);
|
task_lock(tsk);
|
||||||
cg = tsk->cgroups;
|
cg = tsk->cgroups;
|
||||||
tsk->cgroups = &init_css_set;
|
tsk->cgroups = &init_css_set;
|
||||||
|
|
||||||
|
if (run_callbacks && need_forkexit_callback) {
|
||||||
|
/*
|
||||||
|
* modular subsystems can't use callbacks, so no need to lock
|
||||||
|
* the subsys array
|
||||||
|
*/
|
||||||
|
for (i = 0; i < CGROUP_BUILTIN_SUBSYS_COUNT; i++) {
|
||||||
|
struct cgroup_subsys *ss = subsys[i];
|
||||||
|
if (ss->exit) {
|
||||||
|
struct cgroup *old_cgrp =
|
||||||
|
rcu_dereference_raw(cg->subsys[i])->cgroup;
|
||||||
|
struct cgroup *cgrp = task_cgroup(tsk, i);
|
||||||
|
ss->exit(ss, cgrp, old_cgrp, tsk);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
task_unlock(tsk);
|
task_unlock(tsk);
|
||||||
|
|
||||||
if (cg)
|
if (cg)
|
||||||
put_css_set_taskexit(cg);
|
put_css_set_taskexit(cg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -606,9 +606,6 @@ static inline struct task_group *task_group(struct task_struct *p)
|
||||||
struct task_group *tg;
|
struct task_group *tg;
|
||||||
struct cgroup_subsys_state *css;
|
struct cgroup_subsys_state *css;
|
||||||
|
|
||||||
if (p->flags & PF_EXITING)
|
|
||||||
return &root_task_group;
|
|
||||||
|
|
||||||
css = task_subsys_state_check(p, cpu_cgroup_subsys_id,
|
css = task_subsys_state_check(p, cpu_cgroup_subsys_id,
|
||||||
lockdep_is_held(&task_rq(p)->lock));
|
lockdep_is_held(&task_rq(p)->lock));
|
||||||
tg = container_of(css, struct task_group, css);
|
tg = container_of(css, struct task_group, css);
|
||||||
|
@ -8863,7 +8860,8 @@ cpu_cgroup_attach(struct cgroup_subsys *ss, struct cgroup *cgrp,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cpu_cgroup_exit(struct cgroup_subsys *ss, struct task_struct *task)
|
cpu_cgroup_exit(struct cgroup_subsys *ss, struct cgroup *cgrp,
|
||||||
|
struct cgroup *old_cgrp, struct task_struct *task)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* cgroup_exit() is called in the copy_process() failure path.
|
* cgroup_exit() is called in the copy_process() failure path.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue