cgroup/cpuset: Revert "Allow suppression of sched domain rebuild in update_cpumasks_hier()"
[ Upstream commit bcd7012afd7bcd45fcd7a0e2f48e57b273702317 ]
Revert commit 3ae0b77321 ("cgroup/cpuset: Allow suppression of sched
domain rebuild in update_cpumasks_hier()") to allow for an alternative
way to suppress unnecessary rebuild_sched_domains_locked() calls in
update_cpumasks_hier() and elsewhere in a following commit.
Signed-off-by: Waiman Long <longman@redhat.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
Stable-dep-of: a22b3d54de94 ("cgroup/cpuset: Fix race between newly created partition and dying one")
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
9701dcbf5f
commit
2dbd1b1660
+14
-25
@@ -1940,12 +1940,6 @@ static void compute_partition_effective_cpumask(struct cpuset *cs,
|
|||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* update_cpumasks_hier() flags
|
|
||||||
*/
|
|
||||||
#define HIER_CHECKALL 0x01 /* Check all cpusets with no skipping */
|
|
||||||
#define HIER_NO_SD_REBUILD 0x02 /* Don't rebuild sched domains */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* update_cpumasks_hier - Update effective cpumasks and tasks in the subtree
|
* update_cpumasks_hier - Update effective cpumasks and tasks in the subtree
|
||||||
* @cs: the cpuset to consider
|
* @cs: the cpuset to consider
|
||||||
@@ -1960,7 +1954,7 @@ static void compute_partition_effective_cpumask(struct cpuset *cs,
|
|||||||
* Called with cpuset_mutex held
|
* Called with cpuset_mutex held
|
||||||
*/
|
*/
|
||||||
static void update_cpumasks_hier(struct cpuset *cs, struct tmpmasks *tmp,
|
static void update_cpumasks_hier(struct cpuset *cs, struct tmpmasks *tmp,
|
||||||
int flags)
|
bool force)
|
||||||
{
|
{
|
||||||
struct cpuset *cp;
|
struct cpuset *cp;
|
||||||
struct cgroup_subsys_state *pos_css;
|
struct cgroup_subsys_state *pos_css;
|
||||||
@@ -2025,10 +2019,10 @@ static void update_cpumasks_hier(struct cpuset *cs, struct tmpmasks *tmp,
|
|||||||
* Skip the whole subtree if
|
* Skip the whole subtree if
|
||||||
* 1) the cpumask remains the same,
|
* 1) the cpumask remains the same,
|
||||||
* 2) has no partition root state,
|
* 2) has no partition root state,
|
||||||
* 3) HIER_CHECKALL flag not set, and
|
* 3) force flag not set, and
|
||||||
* 4) for v2 load balance state same as its parent.
|
* 4) for v2 load balance state same as its parent.
|
||||||
*/
|
*/
|
||||||
if (!cp->partition_root_state && !(flags & HIER_CHECKALL) &&
|
if (!cp->partition_root_state && !force &&
|
||||||
cpumask_equal(tmp->new_cpus, cp->effective_cpus) &&
|
cpumask_equal(tmp->new_cpus, cp->effective_cpus) &&
|
||||||
(!cgroup_subsys_on_dfl(cpuset_cgrp_subsys) ||
|
(!cgroup_subsys_on_dfl(cpuset_cgrp_subsys) ||
|
||||||
(is_sched_load_balance(parent) == is_sched_load_balance(cp)))) {
|
(is_sched_load_balance(parent) == is_sched_load_balance(cp)))) {
|
||||||
@@ -2130,8 +2124,7 @@ get_css:
|
|||||||
}
|
}
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
|
||||||
if (need_rebuild_sched_domains && !(flags & HIER_NO_SD_REBUILD) &&
|
if (need_rebuild_sched_domains && !force_sd_rebuild)
|
||||||
!force_sd_rebuild)
|
|
||||||
rebuild_sched_domains_locked();
|
rebuild_sched_domains_locked();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2159,9 +2152,7 @@ static void update_sibling_cpumasks(struct cpuset *parent, struct cpuset *cs,
|
|||||||
* directly.
|
* directly.
|
||||||
*
|
*
|
||||||
* The update_cpumasks_hier() function may sleep. So we have to
|
* The update_cpumasks_hier() function may sleep. So we have to
|
||||||
* release the RCU read lock before calling it. HIER_NO_SD_REBUILD
|
* release the RCU read lock before calling it.
|
||||||
* flag is used to suppress rebuild of sched domains as the callers
|
|
||||||
* will take care of that.
|
|
||||||
*/
|
*/
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
cpuset_for_each_child(sibling, pos_css, parent) {
|
cpuset_for_each_child(sibling, pos_css, parent) {
|
||||||
@@ -2177,7 +2168,7 @@ static void update_sibling_cpumasks(struct cpuset *parent, struct cpuset *cs,
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
update_cpumasks_hier(sibling, tmp, HIER_NO_SD_REBUILD);
|
update_cpumasks_hier(sibling, tmp, false);
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
css_put(&sibling->css);
|
css_put(&sibling->css);
|
||||||
}
|
}
|
||||||
@@ -2197,7 +2188,7 @@ static int update_cpumask(struct cpuset *cs, struct cpuset *trialcs,
|
|||||||
struct tmpmasks tmp;
|
struct tmpmasks tmp;
|
||||||
struct cpuset *parent = parent_cs(cs);
|
struct cpuset *parent = parent_cs(cs);
|
||||||
bool invalidate = false;
|
bool invalidate = false;
|
||||||
int hier_flags = 0;
|
bool force = false;
|
||||||
int old_prs = cs->partition_root_state;
|
int old_prs = cs->partition_root_state;
|
||||||
|
|
||||||
/* top_cpuset.cpus_allowed tracks cpu_online_mask; it's read-only */
|
/* top_cpuset.cpus_allowed tracks cpu_online_mask; it's read-only */
|
||||||
@@ -2258,8 +2249,7 @@ static int update_cpumask(struct cpuset *cs, struct cpuset *trialcs,
|
|||||||
* Check all the descendants in update_cpumasks_hier() if
|
* Check all the descendants in update_cpumasks_hier() if
|
||||||
* effective_xcpus is to be changed.
|
* effective_xcpus is to be changed.
|
||||||
*/
|
*/
|
||||||
if (!cpumask_equal(cs->effective_xcpus, trialcs->effective_xcpus))
|
force = !cpumask_equal(cs->effective_xcpus, trialcs->effective_xcpus);
|
||||||
hier_flags = HIER_CHECKALL;
|
|
||||||
|
|
||||||
retval = validate_change(cs, trialcs);
|
retval = validate_change(cs, trialcs);
|
||||||
|
|
||||||
@@ -2327,7 +2317,7 @@ static int update_cpumask(struct cpuset *cs, struct cpuset *trialcs,
|
|||||||
spin_unlock_irq(&callback_lock);
|
spin_unlock_irq(&callback_lock);
|
||||||
|
|
||||||
/* effective_cpus/effective_xcpus will be updated here */
|
/* effective_cpus/effective_xcpus will be updated here */
|
||||||
update_cpumasks_hier(cs, &tmp, hier_flags);
|
update_cpumasks_hier(cs, &tmp, force);
|
||||||
|
|
||||||
/* Update CS_SCHED_LOAD_BALANCE and/or sched_domains, if necessary */
|
/* Update CS_SCHED_LOAD_BALANCE and/or sched_domains, if necessary */
|
||||||
if (cs->partition_root_state)
|
if (cs->partition_root_state)
|
||||||
@@ -2352,7 +2342,7 @@ static int update_exclusive_cpumask(struct cpuset *cs, struct cpuset *trialcs,
|
|||||||
struct tmpmasks tmp;
|
struct tmpmasks tmp;
|
||||||
struct cpuset *parent = parent_cs(cs);
|
struct cpuset *parent = parent_cs(cs);
|
||||||
bool invalidate = false;
|
bool invalidate = false;
|
||||||
int hier_flags = 0;
|
bool force = false;
|
||||||
int old_prs = cs->partition_root_state;
|
int old_prs = cs->partition_root_state;
|
||||||
|
|
||||||
if (!*buf) {
|
if (!*buf) {
|
||||||
@@ -2375,8 +2365,7 @@ static int update_exclusive_cpumask(struct cpuset *cs, struct cpuset *trialcs,
|
|||||||
* Check all the descendants in update_cpumasks_hier() if
|
* Check all the descendants in update_cpumasks_hier() if
|
||||||
* effective_xcpus is to be changed.
|
* effective_xcpus is to be changed.
|
||||||
*/
|
*/
|
||||||
if (!cpumask_equal(cs->effective_xcpus, trialcs->effective_xcpus))
|
force = !cpumask_equal(cs->effective_xcpus, trialcs->effective_xcpus);
|
||||||
hier_flags = HIER_CHECKALL;
|
|
||||||
|
|
||||||
retval = validate_change(cs, trialcs);
|
retval = validate_change(cs, trialcs);
|
||||||
if (retval)
|
if (retval)
|
||||||
@@ -2429,8 +2418,8 @@ static int update_exclusive_cpumask(struct cpuset *cs, struct cpuset *trialcs,
|
|||||||
* of the subtree when it is a valid partition root or effective_xcpus
|
* of the subtree when it is a valid partition root or effective_xcpus
|
||||||
* is updated.
|
* is updated.
|
||||||
*/
|
*/
|
||||||
if (is_partition_valid(cs) || hier_flags)
|
if (is_partition_valid(cs) || force)
|
||||||
update_cpumasks_hier(cs, &tmp, hier_flags);
|
update_cpumasks_hier(cs, &tmp, force);
|
||||||
|
|
||||||
/* Update CS_SCHED_LOAD_BALANCE and/or sched_domains, if necessary */
|
/* Update CS_SCHED_LOAD_BALANCE and/or sched_domains, if necessary */
|
||||||
if (cs->partition_root_state)
|
if (cs->partition_root_state)
|
||||||
@@ -2871,7 +2860,7 @@ out:
|
|||||||
update_unbound_workqueue_cpumask(new_xcpus_state);
|
update_unbound_workqueue_cpumask(new_xcpus_state);
|
||||||
|
|
||||||
/* Force update if switching back to member */
|
/* Force update if switching back to member */
|
||||||
update_cpumasks_hier(cs, &tmpmask, !new_prs ? HIER_CHECKALL : 0);
|
update_cpumasks_hier(cs, &tmpmask, !new_prs);
|
||||||
|
|
||||||
/* Update sched domains and load balance flag */
|
/* Update sched domains and load balance flag */
|
||||||
update_partition_sd_lb(cs, old_prs);
|
update_partition_sd_lb(cs, old_prs);
|
||||||
|
|||||||
Reference in New Issue
Block a user