diff options
| author | Dan Williams <dan.j.williams@intel.com> | 2016-01-10 10:53:55 -0500 |
|---|---|---|
| committer | Dan Williams <dan.j.williams@intel.com> | 2016-01-10 10:53:55 -0500 |
| commit | 8b63b6bfc1a551acf154061699028c7032d7890c (patch) | |
| tree | 16882e9bc9e35eacb870a6d8a71617e579c4ffdc /kernel/cgroup_freezer.c | |
| parent | e07ecd76d4db7bda1e9495395b2110a3fe28845a (diff) | |
| parent | 55f5560d8c18fe33fc169f8d244a9247dcac7612 (diff) | |
Merge branch 'for-4.5/block-dax' into for-4.5/libnvdimm
Diffstat (limited to 'kernel/cgroup_freezer.c')
| -rw-r--r-- | kernel/cgroup_freezer.c | 23 |
1 files changed, 10 insertions, 13 deletions
diff --git a/kernel/cgroup_freezer.c b/kernel/cgroup_freezer.c index f1b30ad5dc6d..2d3df82c54f2 100644 --- a/kernel/cgroup_freezer.c +++ b/kernel/cgroup_freezer.c | |||
| @@ -155,12 +155,10 @@ static void freezer_css_free(struct cgroup_subsys_state *css) | |||
| 155 | * @freezer->lock. freezer_attach() makes the new tasks conform to the | 155 | * @freezer->lock. freezer_attach() makes the new tasks conform to the |
| 156 | * current state and all following state changes can see the new tasks. | 156 | * current state and all following state changes can see the new tasks. |
| 157 | */ | 157 | */ |
| 158 | static void freezer_attach(struct cgroup_subsys_state *new_css, | 158 | static void freezer_attach(struct cgroup_taskset *tset) |
| 159 | struct cgroup_taskset *tset) | ||
| 160 | { | 159 | { |
| 161 | struct freezer *freezer = css_freezer(new_css); | ||
| 162 | struct task_struct *task; | 160 | struct task_struct *task; |
| 163 | bool clear_frozen = false; | 161 | struct cgroup_subsys_state *new_css; |
| 164 | 162 | ||
| 165 | mutex_lock(&freezer_mutex); | 163 | mutex_lock(&freezer_mutex); |
| 166 | 164 | ||
| @@ -174,22 +172,21 @@ static void freezer_attach(struct cgroup_subsys_state *new_css, | |||
| 174 | * current state before executing the following - !frozen tasks may | 172 | * current state before executing the following - !frozen tasks may |
| 175 | * be visible in a FROZEN cgroup and frozen tasks in a THAWED one. | 173 | * be visible in a FROZEN cgroup and frozen tasks in a THAWED one. |
| 176 | */ | 174 | */ |
| 177 | cgroup_taskset_for_each(task, tset) { | 175 | cgroup_taskset_for_each(task, new_css, tset) { |
| 176 | struct freezer *freezer = css_freezer(new_css); | ||
| 177 | |||
| 178 | if (!(freezer->state & CGROUP_FREEZING)) { | 178 | if (!(freezer->state & CGROUP_FREEZING)) { |
| 179 | __thaw_task(task); | 179 | __thaw_task(task); |
| 180 | } else { | 180 | } else { |
| 181 | freeze_task(task); | 181 | freeze_task(task); |
| 182 | freezer->state &= ~CGROUP_FROZEN; | 182 | /* clear FROZEN and propagate upwards */ |
| 183 | clear_frozen = true; | 183 | while (freezer && (freezer->state & CGROUP_FROZEN)) { |
| 184 | freezer->state &= ~CGROUP_FROZEN; | ||
| 185 | freezer = parent_freezer(freezer); | ||
| 186 | } | ||
| 184 | } | 187 | } |
| 185 | } | 188 | } |
| 186 | 189 | ||
| 187 | /* propagate FROZEN clearing upwards */ | ||
| 188 | while (clear_frozen && (freezer = parent_freezer(freezer))) { | ||
| 189 | freezer->state &= ~CGROUP_FROZEN; | ||
| 190 | clear_frozen = freezer->state & CGROUP_FREEZING; | ||
| 191 | } | ||
| 192 | |||
| 193 | mutex_unlock(&freezer_mutex); | 190 | mutex_unlock(&freezer_mutex); |
| 194 | } | 191 | } |
| 195 | 192 | ||
