Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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) <peterz@infradead.org>
Link: https://lore.kernel.org/r/20240813224016.158454756@infradead.org

+14 -16
+4 -13
kernel/sched/core.c
··· 5894 5894 /* Assume the next prioritized class is idle_sched_class */ 5895 5895 if (!p) { 5896 5896 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); 5899 5898 } 5900 5899 5901 5900 /* ··· 5925 5926 } else { 5926 5927 p = class->pick_task(rq); 5927 5928 if (p) { 5928 - put_prev_task(rq, prev); 5929 - set_next_task_first(rq, p); 5929 + put_prev_set_next_task(rq, prev, p); 5930 5930 return p; 5931 5931 } 5932 5932 } ··· 6014 6016 WRITE_ONCE(rq->core_sched_seq, rq->core->core_pick_seq); 6015 6017 6016 6018 next = rq->core_pick; 6017 - if (next != prev) { 6018 - put_prev_task(rq, prev); 6019 - set_next_task_first(rq, next); 6020 - } 6021 - 6022 6019 rq->core_pick = NULL; 6023 - goto out; 6020 + goto out_set_next; 6024 6021 } 6025 6022 6026 6023 prev_balance(rq, prev, rf); ··· 6185 6192 } 6186 6193 6187 6194 out_set_next: 6188 - put_prev_task(rq, prev); 6189 - set_next_task_first(rq, next); 6190 - out: 6195 + put_prev_set_next_task(rq, prev, next); 6191 6196 if (rq->core->core_forceidle_count && next == rq->idle) 6192 6197 queue_core_balance(rq); 6193 6198
+1 -2
kernel/sched/fair.c
··· 8819 8819 8820 8820 simple: 8821 8821 #endif 8822 - put_prev_task(rq, prev); 8823 - set_next_task_fair(rq, p, true); 8822 + put_prev_set_next_task(rq, prev, p); 8824 8823 return p; 8825 8824 8826 8825 idle:
+9 -1
kernel/sched/sched.h
··· 2370 2370 next->sched_class->set_next_task(rq, next, false); 2371 2371 } 2372 2372 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) 2374 2376 { 2377 + WARN_ON_ONCE(rq->curr != prev); 2378 + 2379 + if (next == prev) 2380 + return; 2381 + 2382 + prev->sched_class->put_prev_task(rq, prev); 2375 2383 next->sched_class->set_next_task(rq, next, true); 2376 2384 } 2377 2385