]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
sched: Add put_prev_task(.next)
authorPeter Zijlstra <peterz@infradead.org>
Tue, 13 Aug 2024 22:25:56 +0000 (00:25 +0200)
committerPeter Zijlstra <peterz@infradead.org>
Tue, 3 Sep 2024 13:26:32 +0000 (15:26 +0200)
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
kernel/sched/deadline.c
kernel/sched/fair.c
kernel/sched/idle.c
kernel/sched/rt.c
kernel/sched/sched.h
kernel/sched/stop_task.c

index e83b684306276e6bec14290c21c9515a00c4c07b..9ce93d0bf4523a0a747721284cbf503a3c9d4a5d 100644 (file)
@@ -2436,7 +2436,7 @@ static struct task_struct *pick_task_dl(struct rq *rq)
        return __pick_task_dl(rq);
 }
 
-static void put_prev_task_dl(struct rq *rq, struct task_struct *p)
+static void put_prev_task_dl(struct rq *rq, struct task_struct *p, struct task_struct *next)
 {
        struct sched_dl_entity *dl_se = &p->dl;
        struct dl_rq *dl_rq = &rq->dl;
index f673112170638bb61e470d4e9c52c2a39d294ae2..d697a0a3fc73ca1e6e879b0885ff39dfa7a68f8e 100644 (file)
@@ -8869,7 +8869,7 @@ void fair_server_init(struct rq *rq)
 /*
  * Account for a descheduled task:
  */
-static void put_prev_task_fair(struct rq *rq, struct task_struct *prev)
+static void put_prev_task_fair(struct rq *rq, struct task_struct *prev, struct task_struct *next)
 {
        struct sched_entity *se = &prev->se;
        struct cfs_rq *cfs_rq;
index a343e1c97f56eab324099dfd8ef4ee2608c56e7c..7a105a0123aa5318a186f2d1c9629ed1568b77ea 100644 (file)
@@ -450,7 +450,7 @@ static void wakeup_preempt_idle(struct rq *rq, struct task_struct *p, int flags)
        resched_curr(rq);
 }
 
-static void put_prev_task_idle(struct rq *rq, struct task_struct *prev)
+static void put_prev_task_idle(struct rq *rq, struct task_struct *prev, struct task_struct *next)
 {
        dl_server_update_idle_time(rq, prev);
 }
index 8025f394b0e08676f2e7dee42cf6a81adc6c1978..172c588de54270be8a402908dc6343681a91ded7 100644 (file)
@@ -1748,7 +1748,7 @@ static struct task_struct *pick_task_rt(struct rq *rq)
        return p;
 }
 
-static void put_prev_task_rt(struct rq *rq, struct task_struct *p)
+static void put_prev_task_rt(struct rq *rq, struct task_struct *p, struct task_struct *next)
 {
        struct sched_rt_entity *rt_se = &p->rt;
        struct rt_rq *rt_rq = &rq->rt;
index 2a216c9153e92475fe502ce69af676a1167abe11..3744f16a12933487166735d426815798d5702099 100644 (file)
@@ -2314,7 +2314,7 @@ struct sched_class {
         */
        struct task_struct *(*pick_next_task)(struct rq *rq, struct task_struct *prev);
 
-       void (*put_prev_task)(struct rq *rq, struct task_struct *p);
+       void (*put_prev_task)(struct rq *rq, struct task_struct *p, struct task_struct *next);
        void (*set_next_task)(struct rq *rq, struct task_struct *p, bool first);
 
 #ifdef CONFIG_SMP
@@ -2364,7 +2364,7 @@ struct sched_class {
 static inline void put_prev_task(struct rq *rq, struct task_struct *prev)
 {
        WARN_ON_ONCE(rq->curr != prev);
-       prev->sched_class->put_prev_task(rq, prev);
+       prev->sched_class->put_prev_task(rq, prev, NULL);
 }
 
 static inline void set_next_task(struct rq *rq, struct task_struct *next)
@@ -2393,7 +2393,7 @@ static inline void put_prev_set_next_task(struct rq *rq,
        if (next == prev)
                return;
 
-       prev->sched_class->put_prev_task(rq, prev);
+       prev->sched_class->put_prev_task(rq, prev, next);
        next->sched_class->set_next_task(rq, next, true);
 }
 
index 0fd5352ff0cefa53450a54ab413107092c4f1305..058dd42e3d9b52c8fd7e378d55cea642547afca8 100644 (file)
@@ -59,7 +59,7 @@ static void yield_task_stop(struct rq *rq)
        BUG(); /* the stop task should never yield, its pointless. */
 }
 
-static void put_prev_task_stop(struct rq *rq, struct task_struct *prev)
+static void put_prev_task_stop(struct rq *rq, struct task_struct *prev, struct task_struct *next)
 {
        update_curr_common(rq);
 }