Skip to content

Commit b2d7022

Browse files
author
Peter Zijlstra
committed
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) <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent bd9bbc9 commit b2d7022

File tree

6 files changed

+8
-8
lines changed

6 files changed

+8
-8
lines changed

kernel/sched/deadline.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2436,7 +2436,7 @@ static struct task_struct *pick_task_dl(struct rq *rq)
24362436
return __pick_task_dl(rq);
24372437
}
24382438

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)
24402440
{
24412441
struct sched_dl_entity *dl_se = &p->dl;
24422442
struct dl_rq *dl_rq = &rq->dl;

kernel/sched/fair.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8869,7 +8869,7 @@ void fair_server_init(struct rq *rq)
88698869
/*
88708870
* Account for a descheduled task:
88718871
*/
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)
88738873
{
88748874
struct sched_entity *se = &prev->se;
88758875
struct cfs_rq *cfs_rq;

kernel/sched/idle.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,7 @@ static void wakeup_preempt_idle(struct rq *rq, struct task_struct *p, int flags)
450450
resched_curr(rq);
451451
}
452452

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)
454454
{
455455
dl_server_update_idle_time(rq, prev);
456456
}

kernel/sched/rt.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1748,7 +1748,7 @@ static struct task_struct *pick_task_rt(struct rq *rq)
17481748
return p;
17491749
}
17501750

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)
17521752
{
17531753
struct sched_rt_entity *rt_se = &p->rt;
17541754
struct rt_rq *rt_rq = &rq->rt;

kernel/sched/sched.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2314,7 +2314,7 @@ struct sched_class {
23142314
*/
23152315
struct task_struct *(*pick_next_task)(struct rq *rq, struct task_struct *prev);
23162316

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);
23182318
void (*set_next_task)(struct rq *rq, struct task_struct *p, bool first);
23192319

23202320
#ifdef CONFIG_SMP
@@ -2364,7 +2364,7 @@ struct sched_class {
23642364
static inline void put_prev_task(struct rq *rq, struct task_struct *prev)
23652365
{
23662366
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);
23682368
}
23692369

23702370
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,
23932393
if (next == prev)
23942394
return;
23952395

2396-
prev->sched_class->put_prev_task(rq, prev);
2396+
prev->sched_class->put_prev_task(rq, prev, next);
23972397
next->sched_class->set_next_task(rq, next, true);
23982398
}
23992399

kernel/sched/stop_task.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ static void yield_task_stop(struct rq *rq)
5959
BUG(); /* the stop task should never yield, its pointless. */
6060
}
6161

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)
6363
{
6464
update_curr_common(rq);
6565
}

0 commit comments

Comments
 (0)