Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 599c963a authored by Tejun Heo's avatar Tejun Heo
Browse files

cgroup_freezer: simplify propagation of CGROUP_FROZEN clearing in freezer_attach()



If one or more tasks get moved into a frozen css, the frozen state is
cleared up from the destination css so that it can be reasserted once
the migrated tasks are frozen.  freezer_attach() implements this in
two separate steps - clearing CGROUP_FROZEN on the target css while
processing each task and propagating the clearing upwards after the
task loop is done if necessary.

This patch merges the two steps.  Propagation now takes place inside
the task loop.  This simplifies the code and prepares it for the fix
of multi-destination migration.

Signed-off-by: default avatarTejun Heo <tj@kernel.org>
parent afbcb364
Loading
Loading
Loading
Loading
+7 −10
Original line number Original line Diff line number Diff line
@@ -158,9 +158,7 @@ static void freezer_css_free(struct cgroup_subsys_state *css)
static void freezer_attach(struct cgroup_subsys_state *new_css,
static void freezer_attach(struct cgroup_subsys_state *new_css,
			   struct cgroup_taskset *tset)
			   struct cgroup_taskset *tset)
{
{
	struct freezer *freezer = css_freezer(new_css);
	struct task_struct *task;
	struct task_struct *task;
	bool clear_frozen = false;


	mutex_lock(&freezer_mutex);
	mutex_lock(&freezer_mutex);


@@ -175,19 +173,18 @@ static void freezer_attach(struct cgroup_subsys_state *new_css,
	 * be visible in a FROZEN cgroup and frozen tasks in a THAWED one.
	 * be visible in a FROZEN cgroup and frozen tasks in a THAWED one.
	 */
	 */
	cgroup_taskset_for_each(task, tset) {
	cgroup_taskset_for_each(task, tset) {
		struct freezer *freezer = css_freezer(new_css);

		if (!(freezer->state & CGROUP_FREEZING)) {
		if (!(freezer->state & CGROUP_FREEZING)) {
			__thaw_task(task);
			__thaw_task(task);
		} else {
		} else {
			freeze_task(task);
			freeze_task(task);
			/* clear FROZEN and propagate upwards */
			while (freezer && (freezer->state & CGROUP_FROZEN)) {
				freezer->state &= ~CGROUP_FROZEN;
				freezer->state &= ~CGROUP_FROZEN;
			clear_frozen = true;
				freezer = parent_freezer(freezer);
			}
			}
		}
		}

	/* propagate FROZEN clearing upwards */
	while (clear_frozen && (freezer = parent_freezer(freezer))) {
		freezer->state &= ~CGROUP_FROZEN;
		clear_frozen = freezer->state & CGROUP_FREEZING;
	}
	}


	mutex_unlock(&freezer_mutex);
	mutex_unlock(&freezer_mutex);