mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-06-11 15:46:40 +02:00
Merge tag 'sched-urgent-2025-02-08' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull scheduler fixes from Ingo Molnar: "Fix a cfs_rq->h_nr_runnable accounting bug that trips up a defensive SCHED_WARN_ON() on certain workloads. The bug is believed to be (accidentally) self-correcting, hence no behavioral side effects are expected. Also print se.slice in debug output, since this value can now be set via the syscall ABI and can be useful to track" * tag 'sched-urgent-2025-02-08' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: sched/debug: Provide slice length for fair tasks sched/fair: Fix inaccurate h_nr_runnable accounting with delayed dequeue
This commit is contained in:
@@ -1262,6 +1262,8 @@ void proc_sched_show_task(struct task_struct *p, struct pid_namespace *ns,
|
||||
if (task_has_dl_policy(p)) {
|
||||
P(dl.runtime);
|
||||
P(dl.deadline);
|
||||
} else if (fair_policy(p->policy)) {
|
||||
P(se.slice);
|
||||
}
|
||||
#ifdef CONFIG_SCHED_CLASS_EXT
|
||||
__PS("ext.enabled", task_on_scx(p));
|
||||
|
||||
@@ -5385,6 +5385,15 @@ static __always_inline void return_cfs_rq_runtime(struct cfs_rq *cfs_rq);
|
||||
static void set_delayed(struct sched_entity *se)
|
||||
{
|
||||
se->sched_delayed = 1;
|
||||
|
||||
/*
|
||||
* Delayed se of cfs_rq have no tasks queued on them.
|
||||
* Do not adjust h_nr_runnable since dequeue_entities()
|
||||
* will account it for blocked tasks.
|
||||
*/
|
||||
if (!entity_is_task(se))
|
||||
return;
|
||||
|
||||
for_each_sched_entity(se) {
|
||||
struct cfs_rq *cfs_rq = cfs_rq_of(se);
|
||||
|
||||
@@ -5397,6 +5406,16 @@ static void set_delayed(struct sched_entity *se)
|
||||
static void clear_delayed(struct sched_entity *se)
|
||||
{
|
||||
se->sched_delayed = 0;
|
||||
|
||||
/*
|
||||
* Delayed se of cfs_rq have no tasks queued on them.
|
||||
* Do not adjust h_nr_runnable since a dequeue has
|
||||
* already accounted for it or an enqueue of a task
|
||||
* below it will account for it in enqueue_task_fair().
|
||||
*/
|
||||
if (!entity_is_task(se))
|
||||
return;
|
||||
|
||||
for_each_sched_entity(se) {
|
||||
struct cfs_rq *cfs_rq = cfs_rq_of(se);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user