[PATCH -next] sched: Add dequeue_and_put_task and enqueue_and_set_task helper

From: shangxiaojing
Date: Tue Aug 23 2022 - 02:55:05 EST


Wrap repeated code in helper functions dequeue_and_put_task and
enqueue_and_set_task, note that dequeue_and_put_task is not
applyed in __do_set_cpus_allowed cause the lock assert.

Signed-off-by: shangxiaojing <shangxiaojing@xxxxxxxxxx>
---
kernel/sched/core.c | 103 ++++++++++++++++++--------------------------
1 file changed, 42 insertions(+), 61 deletions(-)

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 61436b8e0337..46d6ba551e04 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -2540,6 +2540,28 @@ void set_cpus_allowed_common(struct task_struct *p, const struct cpumask *new_ma
p->nr_cpus_allowed = cpumask_weight(new_mask);
}

+static __always_inline
+void dequeue_and_put_task(struct rq *rq, struct task_struct *p, int flags,
+ bool *queued, bool *running)
+{
+ *queued = task_on_rq_queued(p);
+ *running = task_current(rq, p);
+ if (*queued)
+ dequeue_task(rq, p, flags);
+ if (*running)
+ put_prev_task(rq, p);
+}
+
+static __always_inline
+void enqueue_and_set_task(struct rq *rq, struct task_struct *p, int flags,
+ bool queued, bool running)
+{
+ if (queued)
+ enqueue_task(rq, p, flags);
+ if (running)
+ set_next_task(rq, p);
+}
+
static void
__do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask, u32 flags)
{
@@ -2579,10 +2601,7 @@ __do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask, u32

p->sched_class->set_cpus_allowed(p, new_mask, flags);

- if (queued)
- enqueue_task(rq, p, ENQUEUE_RESTORE | ENQUEUE_NOCLOCK);
- if (running)
- set_next_task(rq, p);
+ enqueue_and_set_task(rq, p, ENQUEUE_RESTORE | ENQUEUE_NOCLOCK, queued, running);
}

void do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask)
@@ -6876,8 +6895,9 @@ static inline int rt_effective_prio(struct task_struct *p, int prio)
*/
void rt_mutex_setprio(struct task_struct *p, struct task_struct *pi_task)
{
- int prio, oldprio, queued, running, queue_flag =
+ int prio, oldprio, queue_flag =
DEQUEUE_SAVE | DEQUEUE_MOVE | DEQUEUE_NOCLOCK;
+ bool queued, running;
const struct sched_class *prev_class;
struct rq_flags rf;
struct rq *rq;
@@ -6936,12 +6956,7 @@ void rt_mutex_setprio(struct task_struct *p, struct task_struct *pi_task)
queue_flag &= ~DEQUEUE_MOVE;

prev_class = p->sched_class;
- queued = task_on_rq_queued(p);
- running = task_current(rq, p);
- if (queued)
- dequeue_task(rq, p, queue_flag);
- if (running)
- put_prev_task(rq, p);
+ dequeue_and_put_task(rq, p, queue_flag, &queued, &running);

/*
* Boosting condition are:
@@ -6975,10 +6990,7 @@ void rt_mutex_setprio(struct task_struct *p, struct task_struct *pi_task)

__setscheduler_prio(p, prio);

- if (queued)
- enqueue_task(rq, p, queue_flag);
- if (running)
- set_next_task(rq, p);
+ enqueue_and_set_task(rq, p, queue_flag, queued, running);

check_class_changed(rq, p, prev_class, oldprio);
out_unlock:
@@ -7024,22 +7036,14 @@ void set_user_nice(struct task_struct *p, long nice)
p->static_prio = NICE_TO_PRIO(nice);
goto out_unlock;
}
- queued = task_on_rq_queued(p);
- running = task_current(rq, p);
- if (queued)
- dequeue_task(rq, p, DEQUEUE_SAVE | DEQUEUE_NOCLOCK);
- if (running)
- put_prev_task(rq, p);
+ dequeue_and_put_task(rq, p, DEQUEUE_SAVE | DEQUEUE_NOCLOCK, &queued, &running);

p->static_prio = NICE_TO_PRIO(nice);
set_load_weight(p, true);
old_prio = p->prio;
p->prio = effective_prio(p);

- if (queued)
- enqueue_task(rq, p, ENQUEUE_RESTORE | ENQUEUE_NOCLOCK);
- if (running)
- set_next_task(rq, p);
+ enqueue_and_set_task(rq, p, ENQUEUE_RESTORE | ENQUEUE_NOCLOCK, queued, running);

/*
* If the task increased its priority or is running and
@@ -7423,7 +7427,8 @@ static int __sched_setscheduler(struct task_struct *p,
bool user, bool pi)
{
int oldpolicy = -1, policy = attr->sched_policy;
- int retval, oldprio, newprio, queued, running;
+ int retval, oldprio, newprio;
+ bool queued, running;
const struct sched_class *prev_class;
struct callback_head *head;
struct rq_flags rf;
@@ -7588,12 +7593,7 @@ static int __sched_setscheduler(struct task_struct *p,
queue_flags &= ~DEQUEUE_MOVE;
}

- queued = task_on_rq_queued(p);
- running = task_current(rq, p);
- if (queued)
- dequeue_task(rq, p, queue_flags);
- if (running)
- put_prev_task(rq, p);
+ dequeue_and_put_task(rq, p, queue_flags, &queued, &running);

prev_class = p->sched_class;

@@ -7603,18 +7603,15 @@ static int __sched_setscheduler(struct task_struct *p,
}
__setscheduler_uclamp(p, attr);

- if (queued) {
+ if (queued & (oldprio < p->prio)) {
/*
* We enqueue to tail when the priority of a task is
* increased (user space view).
*/
- if (oldprio < p->prio)
- queue_flags |= ENQUEUE_HEAD;
-
- enqueue_task(rq, p, queue_flags);
+ queue_flags |= ENQUEUE_HEAD;
}
- if (running)
- set_next_task(rq, p);
+
+ enqueue_and_set_task(rq, p, queue_flags, queued, running);

check_class_changed(rq, p, prev_class, oldprio);

@@ -9094,20 +9091,12 @@ void sched_setnuma(struct task_struct *p, int nid)
struct rq *rq;

rq = task_rq_lock(p, &rf);
- queued = task_on_rq_queued(p);
- running = task_current(rq, p);

- if (queued)
- dequeue_task(rq, p, DEQUEUE_SAVE);
- if (running)
- put_prev_task(rq, p);
+ dequeue_and_put_task(rq, p, DEQUEUE_SAVE, &queued, &running);

p->numa_preferred_nid = nid;

- if (queued)
- enqueue_task(rq, p, ENQUEUE_RESTORE | ENQUEUE_NOCLOCK);
- if (running)
- set_next_task(rq, p);
+ enqueue_and_set_task(rq, p, ENQUEUE_RESTORE | ENQUEUE_NOCLOCK, queued, running);
task_rq_unlock(rq, p, &rf);
}
#endif /* CONFIG_NUMA_BALANCING */
@@ -10198,28 +10187,20 @@ static void sched_change_group(struct task_struct *tsk, int type)
*/
void sched_move_task(struct task_struct *tsk)
{
- int queued, running, queue_flags =
- DEQUEUE_SAVE | DEQUEUE_MOVE | DEQUEUE_NOCLOCK;
+ int queue_flags = DEQUEUE_SAVE | DEQUEUE_MOVE | DEQUEUE_NOCLOCK;
+ bool queued, running;
struct rq_flags rf;
struct rq *rq;

rq = task_rq_lock(tsk, &rf);
update_rq_clock(rq);

- running = task_current(rq, tsk);
- queued = task_on_rq_queued(tsk);
-
- if (queued)
- dequeue_task(rq, tsk, queue_flags);
- if (running)
- put_prev_task(rq, tsk);
+ dequeue_and_put_task(rq, tsk, queue_flags, &queued, &running);

sched_change_group(tsk, TASK_MOVE_GROUP);

- if (queued)
- enqueue_task(rq, tsk, queue_flags);
+ enqueue_and_set_task(rq, tsk, queue_flags, queued, running);
if (running) {
- set_next_task(rq, tsk);
/*
* After changing group, the running task may have joined a
* throttled one but it's still the running task. Trigger a
--
2.17.1