Commit 97c0054d authored by Will Deacon's avatar Will Deacon Committed by Peter Zijlstra

cpuset: Cleanup cpuset_cpus_allowed_fallback() use in select_fallback_rq()

select_fallback_rq() only needs to recheck for an allowed CPU if the
affinity mask of the task has changed since the last check.

Return a 'bool' from cpuset_cpus_allowed_fallback() to indicate whether
the affinity mask was updated, and use this to elide the allowed check
when the mask has been left alone.

No functional change.
Suggested-by: default avatarValentin Schneider <valentin.schneider@arm.com>
Signed-off-by: default avatarWill Deacon <will@kernel.org>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: default avatarValentin Schneider <valentin.schneider@arm.com>
Link: https://lore.kernel.org/r/20210730112443.23245-5-will@kernel.org
parent 431c69fa
...@@ -59,7 +59,7 @@ extern void cpuset_wait_for_hotplug(void); ...@@ -59,7 +59,7 @@ extern void cpuset_wait_for_hotplug(void);
extern void cpuset_read_lock(void); extern void cpuset_read_lock(void);
extern void cpuset_read_unlock(void); extern void cpuset_read_unlock(void);
extern void cpuset_cpus_allowed(struct task_struct *p, struct cpumask *mask); extern void cpuset_cpus_allowed(struct task_struct *p, struct cpumask *mask);
extern void cpuset_cpus_allowed_fallback(struct task_struct *p); extern bool cpuset_cpus_allowed_fallback(struct task_struct *p);
extern nodemask_t cpuset_mems_allowed(struct task_struct *p); extern nodemask_t cpuset_mems_allowed(struct task_struct *p);
#define cpuset_current_mems_allowed (current->mems_allowed) #define cpuset_current_mems_allowed (current->mems_allowed)
void cpuset_init_current_mems_allowed(void); void cpuset_init_current_mems_allowed(void);
...@@ -188,8 +188,9 @@ static inline void cpuset_cpus_allowed(struct task_struct *p, ...@@ -188,8 +188,9 @@ static inline void cpuset_cpus_allowed(struct task_struct *p,
cpumask_copy(mask, task_cpu_possible_mask(p)); cpumask_copy(mask, task_cpu_possible_mask(p));
} }
static inline void cpuset_cpus_allowed_fallback(struct task_struct *p) static inline bool cpuset_cpus_allowed_fallback(struct task_struct *p)
{ {
return false;
} }
static inline nodemask_t cpuset_mems_allowed(struct task_struct *p) static inline nodemask_t cpuset_mems_allowed(struct task_struct *p)
......
...@@ -3327,17 +3327,22 @@ void cpuset_cpus_allowed(struct task_struct *tsk, struct cpumask *pmask) ...@@ -3327,17 +3327,22 @@ void cpuset_cpus_allowed(struct task_struct *tsk, struct cpumask *pmask)
* which will not contain a sane cpumask during cases such as cpu hotplugging. * which will not contain a sane cpumask during cases such as cpu hotplugging.
* This is the absolute last resort for the scheduler and it is only used if * This is the absolute last resort for the scheduler and it is only used if
* _every_ other avenue has been traveled. * _every_ other avenue has been traveled.
*
* Returns true if the affinity of @tsk was changed, false otherwise.
**/ **/
void cpuset_cpus_allowed_fallback(struct task_struct *tsk) bool cpuset_cpus_allowed_fallback(struct task_struct *tsk)
{ {
const struct cpumask *possible_mask = task_cpu_possible_mask(tsk); const struct cpumask *possible_mask = task_cpu_possible_mask(tsk);
const struct cpumask *cs_mask; const struct cpumask *cs_mask;
bool changed = false;
rcu_read_lock(); rcu_read_lock();
cs_mask = task_cs(tsk)->cpus_allowed; cs_mask = task_cs(tsk)->cpus_allowed;
if (is_in_v2_mode() && cpumask_subset(cs_mask, possible_mask)) if (is_in_v2_mode() && cpumask_subset(cs_mask, possible_mask)) {
do_set_cpus_allowed(tsk, cs_mask); do_set_cpus_allowed(tsk, cs_mask);
changed = true;
}
rcu_read_unlock(); rcu_read_unlock();
/* /*
...@@ -3357,6 +3362,7 @@ void cpuset_cpus_allowed_fallback(struct task_struct *tsk) ...@@ -3357,6 +3362,7 @@ void cpuset_cpus_allowed_fallback(struct task_struct *tsk)
* select_fallback_rq() will fix things ups and set cpu_possible_mask * select_fallback_rq() will fix things ups and set cpu_possible_mask
* if required. * if required.
*/ */
return changed;
} }
void __init cpuset_init_current_mems_allowed(void) void __init cpuset_init_current_mems_allowed(void)
......
...@@ -3141,8 +3141,7 @@ static int select_fallback_rq(int cpu, struct task_struct *p) ...@@ -3141,8 +3141,7 @@ static int select_fallback_rq(int cpu, struct task_struct *p)
/* No more Mr. Nice Guy. */ /* No more Mr. Nice Guy. */
switch (state) { switch (state) {
case cpuset: case cpuset:
if (IS_ENABLED(CONFIG_CPUSETS)) { if (cpuset_cpus_allowed_fallback(p)) {
cpuset_cpus_allowed_fallback(p);
state = possible; state = possible;
break; break;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment