[Devel] [PATCH vz9 2/2] sched/fair: use list_del_init() for cfs_rq_node on dequeue
Konstantin Khorenko
khorenko at virtuozzo.com
Fri Mar 13 22:35:39 MSK 2026
Use list_del_init() instead of list_del() when removing
se->cfs_rq_node in account_entity_dequeue(). This mirrors
the existing pattern used for se->group_node on the line above.
list_del() poisons the prev/next pointers with LIST_POISON values.
If the sched_entity is later accessed after the cfs_rq is freed
(e.g. due to a stale timer or other use-after-free scenario), the
poisoned pointers cause an immediate hard fault. While this is
useful for debugging, it makes recovery impossible.
list_del_init() reinitializes the node to point to itself, so
list_empty() checks on the freed node return true rather than
dereferencing poisoned memory. This provides a safer default and
makes the active_timer callback's list_empty(&cfs_rq->tasks)
check return a benign result even in error scenarios.
This is a defense-in-depth hardening complementary to the
active_timer cancellation fix.
https://virtuozzo.atlassian.net/browse/VSTOR-126785
Signed-off-by: Konstantin Khorenko <khorenko at virtuozzo.com>
Feature: sched: ability to limit number of CPUs available to a CT
---
kernel/sched/fair.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 9b0fe4c8a272f..8ed4cfa0dc83e 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -3298,7 +3298,7 @@ account_entity_dequeue(struct cfs_rq *cfs_rq, struct sched_entity *se)
account_numa_dequeue(rq_of(cfs_rq), task_of(se));
list_del_init(&se->group_node);
#ifdef CONFIG_CFS_CPULIMIT
- list_del(&se->cfs_rq_node);
+ list_del_init(&se->cfs_rq_node);
#endif
}
#endif
--
2.43.0
More information about the Devel
mailing list