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: Add put_prev_task(.next)

In order to tell the previous sched_class what the next task is, add
put_prev_task(.next).

Notable SCX will use this to:

1) determine the next task will leave the SCX sched class and push
the current task to another CPU if possible.
2) statistics on how often and which other classes preempt it

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/r/20240813224016.367421076@infradead.org

+8 -8
+1 -1
kernel/sched/deadline.c
··· 2436 2436 return __pick_task_dl(rq); 2437 2437 } 2438 2438 2439 - static void put_prev_task_dl(struct rq *rq, struct task_struct *p) 2439 + static void put_prev_task_dl(struct rq *rq, struct task_struct *p, struct task_struct *next) 2440 2440 { 2441 2441 struct sched_dl_entity *dl_se = &p->dl; 2442 2442 struct dl_rq *dl_rq = &rq->dl;
+1 -1
kernel/sched/fair.c
··· 8869 8869 /* 8870 8870 * Account for a descheduled task: 8871 8871 */ 8872 - static void put_prev_task_fair(struct rq *rq, struct task_struct *prev) 8872 + static void put_prev_task_fair(struct rq *rq, struct task_struct *prev, struct task_struct *next) 8873 8873 { 8874 8874 struct sched_entity *se = &prev->se; 8875 8875 struct cfs_rq *cfs_rq;
+1 -1
kernel/sched/idle.c
··· 450 450 resched_curr(rq); 451 451 } 452 452 453 - static void put_prev_task_idle(struct rq *rq, struct task_struct *prev) 453 + static void put_prev_task_idle(struct rq *rq, struct task_struct *prev, struct task_struct *next) 454 454 { 455 455 dl_server_update_idle_time(rq, prev); 456 456 }
+1 -1
kernel/sched/rt.c
··· 1748 1748 return p; 1749 1749 } 1750 1750 1751 - static void put_prev_task_rt(struct rq *rq, struct task_struct *p) 1751 + static void put_prev_task_rt(struct rq *rq, struct task_struct *p, struct task_struct *next) 1752 1752 { 1753 1753 struct sched_rt_entity *rt_se = &p->rt; 1754 1754 struct rt_rq *rt_rq = &rq->rt;
+3 -3
kernel/sched/sched.h
··· 2314 2314 */ 2315 2315 struct task_struct *(*pick_next_task)(struct rq *rq, struct task_struct *prev); 2316 2316 2317 - void (*put_prev_task)(struct rq *rq, struct task_struct *p); 2317 + void (*put_prev_task)(struct rq *rq, struct task_struct *p, struct task_struct *next); 2318 2318 void (*set_next_task)(struct rq *rq, struct task_struct *p, bool first); 2319 2319 2320 2320 #ifdef CONFIG_SMP ··· 2364 2364 static inline void put_prev_task(struct rq *rq, struct task_struct *prev) 2365 2365 { 2366 2366 WARN_ON_ONCE(rq->curr != prev); 2367 - prev->sched_class->put_prev_task(rq, prev); 2367 + prev->sched_class->put_prev_task(rq, prev, NULL); 2368 2368 } 2369 2369 2370 2370 static inline void set_next_task(struct rq *rq, struct task_struct *next) ··· 2393 2393 if (next == prev) 2394 2394 return; 2395 2395 2396 - prev->sched_class->put_prev_task(rq, prev); 2396 + prev->sched_class->put_prev_task(rq, prev, next); 2397 2397 next->sched_class->set_next_task(rq, next, true); 2398 2398 } 2399 2399
+1 -1
kernel/sched/stop_task.c
··· 59 59 BUG(); /* the stop task should never yield, its pointless. */ 60 60 } 61 61 62 - static void put_prev_task_stop(struct rq *rq, struct task_struct *prev) 62 + static void put_prev_task_stop(struct rq *rq, struct task_struct *prev, struct task_struct *next) 63 63 { 64 64 update_curr_common(rq); 65 65 }