Messages in this thread Patch in this message | | | From | Xuewen Yan <> | Subject | [PATCH] sched/eevdf: Avoid NULL in pick_eevdf | Date | Mon, 20 Nov 2023 15:38:21 +0800 |
| |
Now in pick_eevdf function, add the pick_first_entity to prevent picking null when using eevdf, however, the leftmost may be null. As a result, it would cause oops because the se is NULL.
Fix this by compare the curr and left, if the left is null, set the se be curr.
Fixes: 147f3efaa241 ("sched/fair: Implement an EEVDF-like scheduling policy") Signed-off-by: Xuewen Yan <xuewen.yan@unisoc.com> --- kernel/sched/fair.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index d7a3c63a2171..10916f6778ac 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -951,12 +951,28 @@ static struct sched_entity *__pick_eevdf(struct cfs_rq *cfs_rq) return NULL; } +/* Just simply choose the se with the smallest vruntime */ +static struct sched_entity *__pick_cfs(struct cfs_rq *cfs_rq) +{ + struct sched_entity *curr = cfs_rq->curr; + struct sched_entity *left = __pick_first_entity(cfs_rq); + + /* + * If curr is set we have to see if its left of the leftmost entity + * still in the tree, provided there was anything in the tree at all. + */ + if (!left || (curr && entity_before(curr, left))) + left = curr; + + return left; +} + static struct sched_entity *pick_eevdf(struct cfs_rq *cfs_rq) { struct sched_entity *se = __pick_eevdf(cfs_rq); if (!se) { - struct sched_entity *left = __pick_first_entity(cfs_rq); + struct sched_entity *left = __pick_cfs(cfs_rq); if (left) { pr_err("EEVDF scheduling fail, picking leftmost\n"); return left; -- 2.25.1
| |