Commit 98c2f700 authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Ingo Molnar

sched/core: Simplify sched_class::pick_next_task()

Now that the indirect class call never uses the last two arguments of
pick_next_task(), remove them.
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: bsegall@google.com
Cc: dietmar.eggemann@arm.com
Cc: juri.lelli@redhat.com
Cc: ktkhai@virtuozzo.com
Cc: mgorman@suse.de
Cc: qais.yousef@arm.com
Cc: qperret@google.com
Cc: rostedt@goodmis.org
Cc: valentin.schneider@arm.com
Cc: vincent.guittot@linaro.org
Link: https://lkml.kernel.org/r/20191108131909.660595546@infradead.orgSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 5d7d6056
...@@ -3924,7 +3924,7 @@ pick_next_task(struct rq *rq, struct task_struct *prev, struct rq_flags *rf) ...@@ -3924,7 +3924,7 @@ pick_next_task(struct rq *rq, struct task_struct *prev, struct rq_flags *rf)
/* Assumes fair_sched_class->next == idle_sched_class */ /* Assumes fair_sched_class->next == idle_sched_class */
if (!p) { if (!p) {
put_prev_task(rq, prev); put_prev_task(rq, prev);
p = pick_next_task_idle(rq, NULL, NULL); p = pick_next_task_idle(rq);
} }
return p; return p;
...@@ -3949,7 +3949,7 @@ pick_next_task(struct rq *rq, struct task_struct *prev, struct rq_flags *rf) ...@@ -3949,7 +3949,7 @@ pick_next_task(struct rq *rq, struct task_struct *prev, struct rq_flags *rf)
put_prev_task(rq, prev); put_prev_task(rq, prev);
for_each_class(class) { for_each_class(class) {
p = class->pick_next_task(rq, NULL, NULL); p = class->pick_next_task(rq);
if (p) if (p)
return p; return p;
} }
...@@ -6210,7 +6210,7 @@ static struct task_struct *__pick_migrate_task(struct rq *rq) ...@@ -6210,7 +6210,7 @@ static struct task_struct *__pick_migrate_task(struct rq *rq)
struct task_struct *next; struct task_struct *next;
for_each_class(class) { for_each_class(class) {
next = class->pick_next_task(rq, NULL, NULL); next = class->pick_next_task(rq);
if (next) { if (next) {
next->sched_class->put_prev_task(rq, next); next->sched_class->put_prev_task(rq, next);
return next; return next;
......
...@@ -1770,15 +1770,12 @@ static struct sched_dl_entity *pick_next_dl_entity(struct rq *rq, ...@@ -1770,15 +1770,12 @@ static struct sched_dl_entity *pick_next_dl_entity(struct rq *rq,
return rb_entry(left, struct sched_dl_entity, rb_node); return rb_entry(left, struct sched_dl_entity, rb_node);
} }
static struct task_struct * static struct task_struct *pick_next_task_dl(struct rq *rq)
pick_next_task_dl(struct rq *rq, struct task_struct *prev, struct rq_flags *rf)
{ {
struct sched_dl_entity *dl_se; struct sched_dl_entity *dl_se;
struct dl_rq *dl_rq = &rq->dl; struct dl_rq *dl_rq = &rq->dl;
struct task_struct *p; struct task_struct *p;
WARN_ON_ONCE(prev || rf);
if (!sched_dl_runnable(rq)) if (!sched_dl_runnable(rq))
return NULL; return NULL;
......
...@@ -6755,6 +6755,11 @@ done: __maybe_unused; ...@@ -6755,6 +6755,11 @@ done: __maybe_unused;
return NULL; return NULL;
} }
static struct task_struct *__pick_next_task_fair(struct rq *rq)
{
return pick_next_task_fair(rq, NULL, NULL);
}
/* /*
* Account for a descheduled task: * Account for a descheduled task:
*/ */
...@@ -10622,7 +10627,7 @@ const struct sched_class fair_sched_class = { ...@@ -10622,7 +10627,7 @@ const struct sched_class fair_sched_class = {
.check_preempt_curr = check_preempt_wakeup, .check_preempt_curr = check_preempt_wakeup,
.pick_next_task = pick_next_task_fair, .pick_next_task = __pick_next_task_fair,
.put_prev_task = put_prev_task_fair, .put_prev_task = put_prev_task_fair,
.set_next_task = set_next_task_fair, .set_next_task = set_next_task_fair,
......
...@@ -391,13 +391,10 @@ static void set_next_task_idle(struct rq *rq, struct task_struct *next) ...@@ -391,13 +391,10 @@ static void set_next_task_idle(struct rq *rq, struct task_struct *next)
schedstat_inc(rq->sched_goidle); schedstat_inc(rq->sched_goidle);
} }
struct task_struct * struct task_struct *pick_next_task_idle(struct rq *rq)
pick_next_task_idle(struct rq *rq, struct task_struct *prev, struct rq_flags *rf)
{ {
struct task_struct *next = rq->idle; struct task_struct *next = rq->idle;
WARN_ON_ONCE(prev || rf);
set_next_task_idle(rq, next); set_next_task_idle(rq, next);
return next; return next;
......
...@@ -1564,13 +1564,10 @@ static struct task_struct *_pick_next_task_rt(struct rq *rq) ...@@ -1564,13 +1564,10 @@ static struct task_struct *_pick_next_task_rt(struct rq *rq)
return rt_task_of(rt_se); return rt_task_of(rt_se);
} }
static struct task_struct * static struct task_struct *pick_next_task_rt(struct rq *rq)
pick_next_task_rt(struct rq *rq, struct task_struct *prev, struct rq_flags *rf)
{ {
struct task_struct *p; struct task_struct *p;
WARN_ON_ONCE(prev || rf);
if (!sched_rt_runnable(rq)) if (!sched_rt_runnable(rq))
return NULL; return NULL;
......
...@@ -1713,20 +1713,8 @@ struct sched_class { ...@@ -1713,20 +1713,8 @@ struct sched_class {
void (*check_preempt_curr)(struct rq *rq, struct task_struct *p, int flags); void (*check_preempt_curr)(struct rq *rq, struct task_struct *p, int flags);
/* struct task_struct *(*pick_next_task)(struct rq *rq);
* Both @prev and @rf are optional and may be NULL, in which case the
* caller must already have invoked put_prev_task(rq, prev, rf).
*
* Otherwise it is the responsibility of the pick_next_task() to call
* put_prev_task() on the @prev task or something equivalent, IFF it
* returns a next task.
*
* In that case (@rf != NULL) it may return RETRY_TASK when it finds a
* higher prio class has runnable tasks.
*/
struct task_struct * (*pick_next_task)(struct rq *rq,
struct task_struct *prev,
struct rq_flags *rf);
void (*put_prev_task)(struct rq *rq, struct task_struct *p); void (*put_prev_task)(struct rq *rq, struct task_struct *p);
void (*set_next_task)(struct rq *rq, struct task_struct *p); void (*set_next_task)(struct rq *rq, struct task_struct *p);
...@@ -1822,7 +1810,7 @@ static inline bool sched_fair_runnable(struct rq *rq) ...@@ -1822,7 +1810,7 @@ static inline bool sched_fair_runnable(struct rq *rq)
} }
extern struct task_struct *pick_next_task_fair(struct rq *rq, struct task_struct *prev, struct rq_flags *rf); extern struct task_struct *pick_next_task_fair(struct rq *rq, struct task_struct *prev, struct rq_flags *rf);
extern struct task_struct *pick_next_task_idle(struct rq *rq, struct task_struct *prev, struct rq_flags *rf); extern struct task_struct *pick_next_task_idle(struct rq *rq);
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
......
...@@ -34,11 +34,8 @@ static void set_next_task_stop(struct rq *rq, struct task_struct *stop) ...@@ -34,11 +34,8 @@ static void set_next_task_stop(struct rq *rq, struct task_struct *stop)
stop->se.exec_start = rq_clock_task(rq); stop->se.exec_start = rq_clock_task(rq);
} }
static struct task_struct * static struct task_struct *pick_next_task_stop(struct rq *rq)
pick_next_task_stop(struct rq *rq, struct task_struct *prev, struct rq_flags *rf)
{ {
WARN_ON_ONCE(prev || rf);
if (!sched_stop_runnable(rq)) if (!sched_stop_runnable(rq))
return NULL; return NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment