From 328d59743d33ef2d8ab5d66bb8140fabb89f990e Mon Sep 17 00:00:00 2001 From: CruzZhao Date: Mon, 24 Nov 2025 16:37:57 +0800 Subject: [PATCH] anolis: sched: fix bugs of task absolute_expeller ANBZ: #7705 Fix two bugs of task absolute_expeller: - When set absoltue_expeller to task in root task group, rq->nr_absolute_expeller will not increase. - When absolute_expeller task deads, the kernel will panic, because we set TASK_DEAD before clear_identity(), which will cause cond resched, and will cause stack release without dequeue task, and will panic when next schedule. To fix this problem, we call clear_identity() before set TASK_DEAD. Fixes: f2e6570f1a31 ("anolis: sched: support to set absolute_expel to task and cgroup") Fixes: 9824b30c896d ("anolis: sched: Introduce per task identity") Signed-off-by: CruzZhao --- kernel/sched/core.c | 4 ++-- kernel/sched/fair.c | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 4e9e7fbdd1ed..71b4ca194999 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -5775,14 +5775,14 @@ static void __sched notrace __schedule(bool preempt) void __noreturn do_task_dead(void) { + clear_task_identity(current); + /* Causes final put_task_struct in finish_task_switch(): */ set_special_state(TASK_DEAD); /* Tell freezer to ignore us: */ current->flags |= PF_NOFREEZE; - clear_task_identity(current); - __schedule(false); BUG(); diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index ae338444df8e..20fac7170d57 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -1207,8 +1207,10 @@ id_update_nr_running(struct task_group *tg, struct task_struct *p, struct rq *rq if (group_identity_disabled()) return; - if (!tg || tg == &root_task_group) + if (!tg) return; + if (tg == &root_task_group) + goto task_absolute_expeller; se = tg->se[rq->cpu]; @@ -1226,6 +1228,7 @@ id_update_nr_running(struct task_group *tg, struct task_struct *p, struct rq *rq * so that no errors will occur when both the task and the task group are set to * absolute_expeller at the same time. */ +task_absolute_expeller: if (task_is_absolute_expeller(p)) rq->nr_absolute_expeller += delta > 0 ? 1 : -1; } -- Gitee