Commit aa890c5f authored by Gaosheng Cui's avatar Gaosheng Cui Committed by openeuler-sync-bot
Browse files

Revert "cgroup: Stop task iteration when rebinding subsystem"

hulk inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I7AZ85



--------------------------------

This reverts commit e52586f4.

Signed-off-by: default avatarGaosheng Cui <cuigaosheng1@huawei.com>
(cherry picked from commit 7a4d01c1)
parent 7fb44d00
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -47,7 +47,6 @@ struct kernel_clone_args;

/* internal flags */
#define CSS_TASK_ITER_SKIPPED		(1U << 16)
#define CSS_TASK_ITER_STOPPED		(1U << 17)

/* a css_task_iter should be treated as an opaque object */
struct css_task_iter {
+1 −33
Original line number Diff line number Diff line
@@ -214,8 +214,6 @@ static int cgroup_apply_control(struct cgroup *cgrp);
static void cgroup_finalize_control(struct cgroup *cgrp, int ret);
static void css_task_iter_skip(struct css_task_iter *it,
			       struct task_struct *task);
static void css_task_iter_stop(struct css_task_iter *it,
			       struct cgroup_subsys *ss);
static int cgroup_destroy_locked(struct cgroup *cgrp);
static struct cgroup_subsys_state *css_create(struct cgroup *cgrp,
					      struct cgroup_subsys *ss);
@@ -856,19 +854,6 @@ static void css_set_skip_task_iters(struct css_set *cset,
		css_task_iter_skip(it, task);
}

/*
 * @cset is moving to other list, it's not safe to continue the iteration,
 * because the cset_head of css_task_iter which is from the old list can
 * not be used as the stop condition of iteration.
 */
static void css_set_stop_iters(struct css_set *cset, struct cgroup_subsys *ss)
{
	struct css_task_iter *it, *pos;

	list_for_each_entry_safe(it, pos, &cset->task_iters, iters_node)
		css_task_iter_stop(it, ss);
}

/**
 * css_set_move_task - move a task from one css_set to another
 * @task: task being moved
@@ -1789,11 +1774,9 @@ int rebind_subsystems(struct cgroup_root *dst_root, u16 ss_mask)
		css->cgroup = dcgrp;

		spin_lock_irq(&css_set_lock);
		hash_for_each(css_set_table, i, cset, hlist) {
			css_set_stop_iters(cset, ss);
		hash_for_each(css_set_table, i, cset, hlist)
			list_move_tail(&cset->e_cset_node[ss->id],
				       &dcgrp->e_csets[ss->id]);
		}
		spin_unlock_irq(&css_set_lock);

		if (ss->css_rstat_flush) {
@@ -4681,16 +4664,6 @@ static void css_task_iter_skip(struct css_task_iter *it,
	}
}

static void css_task_iter_stop(struct css_task_iter *it,
			       struct cgroup_subsys *ss)
{
	lockdep_assert_held(&css_set_lock);

	if (it->ss == ss) {
		it->flags |= CSS_TASK_ITER_STOPPED;
	}
}

static void css_task_iter_advance(struct css_task_iter *it)
{
	struct task_struct *task;
@@ -4794,11 +4767,6 @@ struct task_struct *css_task_iter_next(struct css_task_iter *it)

	spin_lock_irq(&css_set_lock);

	if (it->flags & CSS_TASK_ITER_STOPPED) {
		spin_unlock_irq(&css_set_lock);
		return NULL;
	}

	/* @it may be half-advanced by skips, finish advancing */
	if (it->flags & CSS_TASK_ITER_SKIPPED)
		css_task_iter_advance(it);