diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2016-08-29 00:49:26 -0700 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-08-29 00:49:25 -0700 |
| commit | 2b4e8cbd34b48aa29ef8f7fff9a09d034764eb93 (patch) | |
| tree | b8e30d16af7377e6525eec60501cebd83e9d9669 /kernel/sched | |
| parent | 50618ab44f51b26c088a90d4eb3b9a84bde1302b (diff) | |
| parent | 5ab1e18aa3913d454e1bd1498b20ee581aae2c6b (diff) | |
Merge "Revert "Merge remote-tracking branch 'msm-4.4/tmp-510d0a3f' into msm-4.4""
Diffstat (limited to 'kernel/sched')
| -rw-r--r-- | kernel/sched/core.c | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index a1626bdf8729..ae54c5bfac1d 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -7979,7 +7979,7 @@ void set_curr_task(int cpu, struct task_struct *p) /* task_group_lock serializes the addition/removal of task groups */ static DEFINE_SPINLOCK(task_group_lock); -static void sched_free_group(struct task_group *tg) +static void free_sched_group(struct task_group *tg) { free_fair_sched_group(tg); free_rt_sched_group(tg); @@ -8005,7 +8005,7 @@ struct task_group *sched_create_group(struct task_group *parent) return tg; err: - sched_free_group(tg); + free_sched_group(tg); return ERR_PTR(-ENOMEM); } @@ -8025,16 +8025,17 @@ void sched_online_group(struct task_group *tg, struct task_group *parent) } /* rcu callback to free various structures associated with a task group */ -static void sched_free_group_rcu(struct rcu_head *rhp) +static void free_sched_group_rcu(struct rcu_head *rhp) { /* now it should be safe to free those cfs_rqs */ - sched_free_group(container_of(rhp, struct task_group, rcu)); + free_sched_group(container_of(rhp, struct task_group, rcu)); } +/* Destroy runqueue etc associated with a task group */ void sched_destroy_group(struct task_group *tg) { /* wait for possible concurrent references to cfs_rqs complete */ - call_rcu(&tg->rcu, sched_free_group_rcu); + call_rcu(&tg->rcu, free_sched_group_rcu); } void sched_offline_group(struct task_group *tg) @@ -8495,26 +8496,31 @@ cpu_cgroup_css_alloc(struct cgroup_subsys_state *parent_css) if (IS_ERR(tg)) return ERR_PTR(-ENOMEM); - sched_online_group(tg, parent); - return &tg->css; } -static void cpu_cgroup_css_released(struct cgroup_subsys_state *css) +static int cpu_cgroup_css_online(struct cgroup_subsys_state *css) { struct task_group *tg = css_tg(css); + struct task_group *parent = css_tg(css->parent); - sched_offline_group(tg); + if (parent) + sched_online_group(tg, parent); + return 0; } static void cpu_cgroup_css_free(struct cgroup_subsys_state *css) { struct task_group *tg = css_tg(css); - /* - * Relies on the RCU grace period between css_released() and this. - */ - sched_free_group(tg); + sched_destroy_group(tg); +} + +static void cpu_cgroup_css_offline(struct cgroup_subsys_state *css) +{ + struct task_group *tg = css_tg(css); + + sched_offline_group(tg); } static void cpu_cgroup_fork(struct task_struct *task, void *private) @@ -8881,8 +8887,9 @@ static struct cftype cpu_files[] = { struct cgroup_subsys cpu_cgrp_subsys = { .css_alloc = cpu_cgroup_css_alloc, - .css_released = cpu_cgroup_css_released, .css_free = cpu_cgroup_css_free, + .css_online = cpu_cgroup_css_online, + .css_offline = cpu_cgroup_css_offline, .fork = cpu_cgroup_fork, .can_attach = cpu_cgroup_can_attach, .attach = cpu_cgroup_attach, |
