Skip to content

Commit 436f3ee

Browse files
author
Peter Zijlstra
committed
sched: Combine the last put_prev_task() and the first set_next_task()
Ensure the last put_prev_task() and the first set_next_task() always go together. Signed-off-by: Peter Zijlstra (Intel) <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent fd03c5b commit 436f3ee

File tree

3 files changed

+14
-16
lines changed

3 files changed

+14
-16
lines changed

kernel/sched/core.c

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5894,8 +5894,7 @@ __pick_next_task(struct rq *rq, struct task_struct *prev, struct rq_flags *rf)
58945894
/* Assume the next prioritized class is idle_sched_class */
58955895
if (!p) {
58965896
p = pick_task_idle(rq);
5897-
put_prev_task(rq, prev);
5898-
set_next_task_first(rq, p);
5897+
put_prev_set_next_task(rq, prev, p);
58995898
}
59005899

59015900
/*
@@ -5926,8 +5925,7 @@ __pick_next_task(struct rq *rq, struct task_struct *prev, struct rq_flags *rf)
59265925
} else {
59275926
p = class->pick_task(rq);
59285927
if (p) {
5929-
put_prev_task(rq, prev);
5930-
set_next_task_first(rq, p);
5928+
put_prev_set_next_task(rq, prev, p);
59315929
return p;
59325930
}
59335931
}
@@ -6016,13 +6014,8 @@ pick_next_task(struct rq *rq, struct task_struct *prev, struct rq_flags *rf)
60166014
WRITE_ONCE(rq->core_sched_seq, rq->core->core_pick_seq);
60176015

60186016
next = rq->core_pick;
6019-
if (next != prev) {
6020-
put_prev_task(rq, prev);
6021-
set_next_task_first(rq, next);
6022-
}
6023-
60246017
rq->core_pick = NULL;
6025-
goto out;
6018+
goto out_set_next;
60266019
}
60276020

60286021
prev_balance(rq, prev, rf);
@@ -6192,9 +6185,7 @@ pick_next_task(struct rq *rq, struct task_struct *prev, struct rq_flags *rf)
61926185
}
61936186

61946187
out_set_next:
6195-
put_prev_task(rq, prev);
6196-
set_next_task_first(rq, next);
6197-
out:
6188+
put_prev_set_next_task(rq, prev, next);
61986189
if (rq->core->core_forceidle_count && next == rq->idle)
61996190
queue_core_balance(rq);
62006191

kernel/sched/fair.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8819,8 +8819,7 @@ pick_next_task_fair(struct rq *rq, struct task_struct *prev, struct rq_flags *rf
88198819

88208820
simple:
88218821
#endif
8822-
put_prev_task(rq, prev);
8823-
set_next_task_fair(rq, p, true);
8822+
put_prev_set_next_task(rq, prev, p);
88248823
return p;
88258824

88268825
idle:

kernel/sched/sched.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2370,8 +2370,16 @@ static inline void set_next_task(struct rq *rq, struct task_struct *next)
23702370
next->sched_class->set_next_task(rq, next, false);
23712371
}
23722372

2373-
static inline void set_next_task_first(struct rq *rq, struct task_struct *next)
2373+
static inline void put_prev_set_next_task(struct rq *rq,
2374+
struct task_struct *prev,
2375+
struct task_struct *next)
23742376
{
2377+
WARN_ON_ONCE(rq->curr != prev);
2378+
2379+
if (next == prev)
2380+
return;
2381+
2382+
prev->sched_class->put_prev_task(rq, prev);
23752383
next->sched_class->set_next_task(rq, next, true);
23762384
}
23772385

0 commit comments

Comments
 (0)