hulk inclusion category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/IDC9YK -------------------------------- This commit comes from mainline 98442f0ccd82 ("sched: Fix delayed_dequque vs switched_from_fair()"), it was to fix the bug in sched delayed queue in EEVDF, but this version does not has this feature delayed queue, so only pick the necessary part for sched_ext, because some sched_ext code will depend on this function, and make less conflicts. Signed-off-by: Zicheng Qu <quzicheng@huawei.com> --- kernel/sched/core.c | 21 +++++++++++++++++++++ kernel/sched/ext.c | 13 +++++++++++-- kernel/sched/sched.h | 5 +++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 23f220e8ae95..d852cf17b2c4 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -6989,6 +6989,27 @@ void __setscheduler_prio(struct task_struct *p, int prio) p->prio = prio; } +/* + * Currently, __setscheduler_class is mainly picked for sched_ext, + * but in mainline it is for delayed_dequeue in EEVDF, the commit is + * 98442f0ccd82 ("sched: Fix delayed_dequeue vs switched_from_fair()") + */ +const struct sched_class *__setscheduler_class(struct task_struct *p, int prio) +{ + if (dl_prio(prio)) + return &dl_sched_class; + + if (rt_prio(prio)) + return &rt_sched_class; + +#ifdef CONFIG_SCHED_CLASS_EXT + if (task_should_scx(p)) + return &ext_sched_class; +#endif + + return &fair_sched_class; +} + #ifdef CONFIG_RT_MUTEXES /* diff --git a/kernel/sched/ext.c b/kernel/sched/ext.c index 05001b299c27..868f6e5a385e 100644 --- a/kernel/sched/ext.c +++ b/kernel/sched/ext.c @@ -4501,7 +4501,11 @@ static void scx_ops_disable_workfn(struct kthread_work *work) sched_deq_and_put_task(p, DEQUEUE_SAVE | DEQUEUE_MOVE, &ctx); - __setscheduler_prio(p, p->prio); + /* + * pick from mainline + * 98442f0ccd82 ("sched: Fix delayed_dequeue vs switched_from_fair()") + */ + p->sched_class = __setscheduler_class(p, p->prio); check_class_changing(task_rq(p), p, old_class); sched_enq_and_set_task(&ctx); @@ -5212,7 +5216,12 @@ static int scx_ops_enable(struct sched_ext_ops *ops) sched_deq_and_put_task(p, DEQUEUE_SAVE | DEQUEUE_MOVE, &ctx); p->scx.slice = SCX_SLICE_DFL; - __setscheduler_prio(p, p->prio); + + /* + * pick from mainline + * 98442f0ccd82 ("sched: Fix delayed_dequeue vs switched_from_fair()") + */ + p->sched_class = __setscheduler_class(p, p->prio); check_class_changing(task_rq(p), p, old_class); sched_enq_and_set_task(&ctx); diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 20e8de85c94d..3ea70281aab6 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -4052,6 +4052,11 @@ extern int __sched_setscheduler(struct task_struct *p, const struct sched_attr * extern int __sched_setaffinity(struct task_struct *p, struct affinity_context *ctx); extern void __setscheduler_prio(struct task_struct *p, int prio); extern void __setscheduler_params(struct task_struct *p, const struct sched_attr *attr); +/* + * pick from mainline + * 98442f0ccd82 ("sched: Fix delayed_dequeue vs switched_from_fair()") + */ +extern const struct sched_class *__setscheduler_class(struct task_struct *p, int prio); extern void set_load_weight(struct task_struct *p, bool update_load); extern void enqueue_task(struct rq *rq, struct task_struct *p, int flags); extern bool dequeue_task(struct rq *rq, struct task_struct *p, int flags); -- 2.34.1