sched: Misc cleanups
cover sched: Misc cleanups
Misc details I noticed while working on the fair scheduling code.
Arguably sum_w_vruntime is a bit of a tongue-twister - any better ideas?
The latest version of this series can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/mingo/tip.git WIP.sched/misc
The commits are based on tip:sched/core.
Thanks,
Ingo
================
Ingo Molnar (6):
sched/fair: Join two #ifdef CONFIG_CFS_BANDWIDTH blocks
sched/fair: Clean up comments in 'struct cfs_rq'
sched/fair: Separate se->vlag from se->vprot
sched/fair: Rename avg_vruntime() to cfs_avg_vruntime()
sched/fair: Rename cfs_rq::avg_load to cfs_rq::sum_weight sched/fair: Rename cfs_rq::avg_vruntime to ::sum_w_vruntime, and helper functions
include/linux/sched.h | 4 ++-- kernel/sched/debug.c | 4 ++-- kernel/sched/fair.c | 48 ++++++++++++++++++++++++------------------------ kernel/sched/sched.h | 28 +++++++++++++--------------- 4 files changed, 41 insertions(+), 43 deletions(-)
Signature · 1 line
2.51.0
PATCH 1/6 sched/fair: Join two #ifdef CONFIG_CFS_BANDWIDTH blocks
Join two identical #ifdef blocks:
#ifdef CONFIG_CFS_BANDWIDTH ... #endif #ifdef CONFIG_CFS_BANDWIDTH ... #endif
Also mark nested #ifdef blocks in the usual fashion, to make it more apparent where in a nested hierarchy of #ifdefs we are at a glance.
--- kernel/sched/sched.h | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
kernel/sched/sched.h +4 -6
@@ -726,9 +726,7 @@ struct cfs_rq {unsigned long h_load;u64 last_h_load_update;struct sched_entity *h_load_next; -#endif /* CONFIG_FAIR_GROUP_SCHED */ -#ifdef CONFIG_FAIR_GROUP_SCHED struct rq *rq;/* CPU runqueue to which this cfs_rq is attached */ /*
@@ -746,14 +744,14 @@ struct cfs_rq {/* Locally cached copy of our task_group's idle value */ int idle; -#ifdef CONFIG_CFS_BANDWIDTH +# ifdef CONFIG_CFS_BANDWIDTH int runtime_enabled;s64 runtime_remaining;u64 throttled_pelt_idle; -#ifndef CONFIG_64BIT +# ifndef CONFIG_64BIT u64 throttled_pelt_idle_copy; -#endif +# endif u64 throttled_clock;u64 throttled_clock_pelt;u64 throttled_clock_pelt_time;
@@ -765,7 +763,7 @@ struct cfs_rq {struct list_head throttled_list;struct list_head throttled_csd_list;struct list_head throttled_limbo_list; -#endif /* CONFIG_CFS_BANDWIDTH */ +# endif /* CONFIG_CFS_BANDWIDTH */ #endif /* CONFIG_FAIR_GROUP_SCHED */ };
Signature · 1 line
2.51.0
Re: [PATCH 1/6] sched/fair: Join two #ifdef CONFIG_CFS_BANDWIDTH blocks
Quoted 10 lines · Ingo Molnar
Join two identical #ifdef blocks:
#ifdef CONFIG_CFS_BANDWIDTH ... #endif #ifdef CONFIG_CFS_BANDWIDTH ... #endif
nit: I think it is CONFIG_FAIR_GROUP_SCHED here and in the subject line.
Quoted 42 lines
Also mark nested #ifdef blocks in the usual fashion, to make it more apparent where in a nested hierarchy of #ifdefs we are at a glance.
Signed-off-by Ingo Molnar <[email protected]>--- kernel/sched/sched.h | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)kernel/sched/sched.h +3
-5@@ -726,9 +726,7 @@ struct cfs_rq {unsigned long h_load;u64 last_h_load_update;struct sched_entity *h_load_next; -#endif /* CONFIG_FAIR_GROUP_SCHED */ -#ifdef CONFIG_FAIR_GROUP_SCHED struct rq *rq;/* CPU runqueue to which this cfs_rq is attached */ /* @@ -746,14 +744,14 @@ struct cfs_rq {/* Locally cached copy of our task_group's idle value */ int idle; -#ifdef CONFIG_CFS_BANDWIDTH +# ifdef CONFIG_CFS_BANDWIDTH int runtime_enabled;s64 runtime_remaining;u64 throttled_pelt_idle; -#ifndef CONFIG_64BIT +# ifndef CONFIG_64BIT u64 throttled_pelt_idle_copy; -#endif +# endif u64 throttled_clock;u64 throttled_clock_pelt;u64 throttled_clock_pelt_time;
kernel/sched/sched.h struct cfs_rq { · line 769
Quoted 8 lines
kernel/sched/sched.h +1
-1@@ -765,7 +763,7 @@ struct cfs_rq {struct list_head throttled_list;struct list_head throttled_csd_list;struct list_head throttled_limbo_list; -#endif /* CONFIG_CFS_BANDWIDTH */ +# endif /* CONFIG_CFS_BANDWIDTH */ #endif /* CONFIG_FAIR_GROUP_SCHED */ };
Other than above nit,
Re: [PATCH 1/6] sched/fair: Join two #ifdef CONFIG_CFS_BANDWIDTH blocks
Quoted 7 lines · Shrikanth Hegde
Quoted 6 lines · Ingo Molnar
Join two identical #ifdef blocks:
#ifdef CONFIG_CFS_BANDWIDTH ... #endif
Quoted 6 lines
Quoted 4 lines
#ifdef CONFIG_CFS_BANDWIDTH ... #endifnit: I think it is
CONFIG_FAIR_GROUP_SCHEDhere and in the subject line.
Indeed, fixed.
Thanks,
Ingo
[tip: sched/core] sched/fair: Join two #ifdef CONFIG_FAIR_GROUP_SCHED blocks
In reply to Ingo MolnarThe following commit has been merged into the sched/core branch of tip:
The following commit has been merged into the sched/core branch of tip:
Commit-ID: 7e1f73851205657e90e34a4013d86d129ed514a1 Gitweb: https://git.kernel.org/tip/7e1f73851205657e90e34a4013d86d129ed514a1 Author: Ingo Molnar <[email protected]> AuthorDate: Wed, 26 Nov 2025 11:31:09 +01:00 Committer: Ingo Molnar <[email protected]> CommitterDate: Sun, 14 Dec 2025 08:25:02 +01:00
sched/fair: Join two #ifdef CONFIG_FAIR_GROUP_SCHED blocks
Join two identical #ifdef blocks:
#ifdef CONFIG_FAIR_GROUP_SCHED ... #endif #ifdef CONFIG_FAIR_GROUP_SCHED ... #endif
Also mark nested #ifdef blocks in the usual fashion, to make it more apparent where in a nested hierarchy of #ifdefs we are at a glance.
--- kernel/sched/sched.h | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
kernel/sched/sched.h +4 -6
@@ -726,9 +726,7 @@ struct cfs_rq {unsigned long h_load;u64 last_h_load_update;struct sched_entity *h_load_next; -#endif /* CONFIG_FAIR_GROUP_SCHED */ -#ifdef CONFIG_FAIR_GROUP_SCHED struct rq *rq;/* CPU runqueue to which this cfs_rq is attached */ /*
@@ -746,14 +744,14 @@ struct cfs_rq {/* Locally cached copy of our task_group's idle value */ int idle; -#ifdef CONFIG_CFS_BANDWIDTH +# ifdef CONFIG_CFS_BANDWIDTH int runtime_enabled;s64 runtime_remaining;u64 throttled_pelt_idle; -#ifndef CONFIG_64BIT +# ifndef CONFIG_64BIT u64 throttled_pelt_idle_copy; -#endif +# endif u64 throttled_clock;u64 throttled_clock_pelt;u64 throttled_clock_pelt_time;
@@ -765,7 +763,7 @@ struct cfs_rq {struct list_head throttled_list;struct list_head throttled_csd_list;struct list_head throttled_limbo_list; -#endif /* CONFIG_CFS_BANDWIDTH */ +# endif /* CONFIG_CFS_BANDWIDTH */ #endif /* CONFIG_FAIR_GROUP_SCHED */ };
[tip: sched/core] sched/fair: Join two #ifdef CONFIG_FAIR_GROUP_SCHED blocks
In reply to Ingo MolnarThe following commit has been merged into the sched/core branch of tip:
The following commit has been merged into the sched/core branch of tip:
Commit-ID: 2b8c3d3dc9b1ee323e2982945088e3f5eebdf3dd Gitweb: https://git.kernel.org/tip/2b8c3d3dc9b1ee323e2982945088e3f5eebdf3dd Author: Ingo Molnar <[email protected]> AuthorDate: Wed, 26 Nov 2025 11:31:09 +01:00 Committer: Ingo Molnar <[email protected]> CommitterDate: Mon, 15 Dec 2025 07:52:44 +01:00
sched/fair: Join two #ifdef CONFIG_FAIR_GROUP_SCHED blocks
Join two identical #ifdef blocks:
#ifdef CONFIG_FAIR_GROUP_SCHED ... #endif #ifdef CONFIG_FAIR_GROUP_SCHED ... #endif
Also mark nested #ifdef blocks in the usual fashion, to make it more apparent where in a nested hierarchy of #ifdefs we are at a glance.
--- kernel/sched/sched.h | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
kernel/sched/sched.h +4 -6
@@ -726,9 +726,7 @@ struct cfs_rq {unsigned long h_load;u64 last_h_load_update;struct sched_entity *h_load_next; -#endif /* CONFIG_FAIR_GROUP_SCHED */ -#ifdef CONFIG_FAIR_GROUP_SCHED struct rq *rq;/* CPU runqueue to which this cfs_rq is attached */ /*
@@ -746,14 +744,14 @@ struct cfs_rq {/* Locally cached copy of our task_group's idle value */ int idle; -#ifdef CONFIG_CFS_BANDWIDTH +# ifdef CONFIG_CFS_BANDWIDTH int runtime_enabled;s64 runtime_remaining;u64 throttled_pelt_idle; -#ifndef CONFIG_64BIT +# ifndef CONFIG_64BIT u64 throttled_pelt_idle_copy; -#endif +# endif u64 throttled_clock;u64 throttled_clock_pelt;u64 throttled_clock_pelt_time;
@@ -765,7 +763,7 @@ struct cfs_rq {struct list_head throttled_list;struct list_head throttled_csd_list;struct list_head throttled_limbo_list; -#endif /* CONFIG_CFS_BANDWIDTH */ +# endif /* CONFIG_CFS_BANDWIDTH */ #endif /* CONFIG_FAIR_GROUP_SCHED */ };
PATCH 2/6 sched/fair: Clean up comments in 'struct cfs_rq'
In reply to Ingo Molnar - Fix vertical alignment
- Fix typos
- Fix capitalization
--- kernel/sched/sched.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
kernel/sched/sched.h +6 -6
@@ -670,13 +670,13 @@ struct balance_callback {void (*func)(struct rq *rq); }; -/* CFS-related fields in a runqueue */ +/* Fair scheduling SCHED_{NORMAL,BATCH,IDLE} related fields in a runqueue: */ struct cfs_rq {struct load_weight load;unsigned int nr_queued; -unsigned int h_nr_queued;/* SCHED_{NORMAL,BATCH,IDLE} */ -unsigned int h_nr_runnable;/* SCHED_{NORMAL,BATCH,IDLE} */ -unsigned int h_nr_idle;/* SCHED_IDLE */ +unsigned int h_nr_queued;/* SCHED_{NORMAL,BATCH,IDLE} */ +unsigned int h_nr_runnable;/* SCHED_{NORMAL,BATCH,IDLE} */ +unsigned int h_nr_idle;/* SCHED_IDLE */ s64 avg_vruntime;u64 avg_load;
@@ -690,7 +690,7 @@ struct cfs_rq {struct rb_root_cached tasks_timeline;/* -* 'curr' points to currently running entity on this cfs_rq. +* 'curr' points to the currently running entity on this cfs_rq. * It is set to NULL otherwise (i.e when none are currently running). */ struct sched_entity *curr;
@@ -739,7 +739,7 @@ struct cfs_rq {*/ int on_list;struct list_head leaf_cfs_rq_list; -struct task_group *tg;/* group that "owns" this runqueue */ +struct task_group *tg;/* Group that "owns" this runqueue */ /* Locally cached copy of our task_group's idle value */ int idle;
Signature · 1 line
2.51.0
[tip: sched/core] sched/fair: Clean up comments in 'struct cfs_rq'
The following commit has been merged into the sched/core branch of tip:
The following commit has been merged into the sched/core branch of tip:
Commit-ID: 3dbcec53616803b71e00084a94426a017f0ef04f Gitweb: https://git.kernel.org/tip/3dbcec53616803b71e00084a94426a017f0ef04f Author: Ingo Molnar <[email protected]> AuthorDate: Wed, 26 Nov 2025 11:29:18 +01:00 Committer: Ingo Molnar <[email protected]> CommitterDate: Sun, 14 Dec 2025 08:25:02 +01:00
sched/fair: Clean up comments in 'struct cfs_rq'
- Fix vertical alignment
- Fix typos
- Fix capitalization
--- kernel/sched/sched.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
kernel/sched/sched.h +6 -6
@@ -670,13 +670,13 @@ struct balance_callback {void (*func)(struct rq *rq); }; -/* CFS-related fields in a runqueue */ +/* Fair scheduling SCHED_{NORMAL,BATCH,IDLE} related fields in a runqueue: */ struct cfs_rq {struct load_weight load;unsigned int nr_queued; -unsigned int h_nr_queued;/* SCHED_{NORMAL,BATCH,IDLE} */ -unsigned int h_nr_runnable;/* SCHED_{NORMAL,BATCH,IDLE} */ -unsigned int h_nr_idle;/* SCHED_IDLE */ +unsigned int h_nr_queued;/* SCHED_{NORMAL,BATCH,IDLE} */ +unsigned int h_nr_runnable;/* SCHED_{NORMAL,BATCH,IDLE} */ +unsigned int h_nr_idle;/* SCHED_IDLE */ s64 avg_vruntime;u64 avg_load;
@@ -690,7 +690,7 @@ struct cfs_rq {struct rb_root_cached tasks_timeline;/* -* 'curr' points to currently running entity on this cfs_rq. +* 'curr' points to the currently running entity on this cfs_rq. * It is set to NULL otherwise (i.e when none are currently running). */ struct sched_entity *curr;
@@ -739,7 +739,7 @@ struct cfs_rq {*/ int on_list;struct list_head leaf_cfs_rq_list; -struct task_group *tg;/* group that "owns" this runqueue */ +struct task_group *tg;/* Group that "owns" this runqueue */ /* Locally cached copy of our task_group's idle value */ int idle;
[tip: sched/core] sched/fair: Clean up comments in 'struct cfs_rq'
In reply to Ingo MolnarThe following commit has been merged into the sched/core branch of tip:
The following commit has been merged into the sched/core branch of tip:
Commit-ID: fb9a7458e508ef1beae8d80ee40c2cd1b5b45f3a Gitweb: https://git.kernel.org/tip/fb9a7458e508ef1beae8d80ee40c2cd1b5b45f3a Author: Ingo Molnar <[email protected]> AuthorDate: Wed, 26 Nov 2025 11:29:18 +01:00 Committer: Ingo Molnar <[email protected]> CommitterDate: Mon, 15 Dec 2025 07:52:44 +01:00
sched/fair: Clean up comments in 'struct cfs_rq'
- Fix vertical alignment
- Fix typos
- Fix capitalization
--- kernel/sched/sched.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
kernel/sched/sched.h +6 -6
@@ -670,13 +670,13 @@ struct balance_callback {void (*func)(struct rq *rq); }; -/* CFS-related fields in a runqueue */ +/* Fair scheduling SCHED_{NORMAL,BATCH,IDLE} related fields in a runqueue: */ struct cfs_rq {struct load_weight load;unsigned int nr_queued; -unsigned int h_nr_queued;/* SCHED_{NORMAL,BATCH,IDLE} */ -unsigned int h_nr_runnable;/* SCHED_{NORMAL,BATCH,IDLE} */ -unsigned int h_nr_idle;/* SCHED_IDLE */ +unsigned int h_nr_queued;/* SCHED_{NORMAL,BATCH,IDLE} */ +unsigned int h_nr_runnable;/* SCHED_{NORMAL,BATCH,IDLE} */ +unsigned int h_nr_idle;/* SCHED_IDLE */ s64 avg_vruntime;u64 avg_load;
@@ -690,7 +690,7 @@ struct cfs_rq {struct rb_root_cached tasks_timeline;/* -* 'curr' points to currently running entity on this cfs_rq. +* 'curr' points to the currently running entity on this cfs_rq. * It is set to NULL otherwise (i.e when none are currently running). */ struct sched_entity *curr;
@@ -739,7 +739,7 @@ struct cfs_rq {*/ int on_list;struct list_head leaf_cfs_rq_list; -struct task_group *tg;/* group that "owns" this runqueue */ +struct task_group *tg;/* Group that "owns" this runqueue */ /* Locally cached copy of our task_group's idle value */ int idle;
PATCH 3/6 sched/fair: Separate se->vlag from se->vprot
In reply to Ingo MolnarThere's no real space concerns here and keeping these fields in a union makes reading (and tracing) the scheduler code harder.
--- include/linux/sched.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
include/linux/sched.h +2 -2
@@ -586,7 +586,7 @@ struct sched_entity {u64 sum_exec_runtime;u64 prev_sum_exec_runtime;u64 vruntime; -union { +// union { /* * When !@on_rq this field is vlag. * When cfs_rq->curr == se (which implies @on_rq)
@@ -594,7 +594,7 @@ struct sched_entity {*/ s64 vlag;u64 vprot; - }; +// }; u64 slice;u64 nr_migrations;
Signature · 1 line
2.51.0
PATCH v2 3/6 sched/fair: Separate se->vlag from se->vprot
Quoted 22 lines · Ingo Molnar
There's no real space concerns here and keeping these fields in a union makes reading (and tracing) the scheduler code harder.
Signed-off-by Ingo Molnar <[email protected]>--- include/linux/sched.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)include/linux/sched.h +1
-1@@ -586,7 +586,7 @@ struct sched_entity {u64 sum_exec_runtime;u64 prev_sum_exec_runtime;u64 vruntime; -union { +// union { /* * When !@on_rq this field is vlag. * When cfs_rq->curr == se (which implies @on_rq)
include/linux/sched.h struct sched_entity { · line 600
Quoted 8 lines
include/linux/sched.h +1
-1@@ -594,7 +594,7 @@ struct sched_entity {*/ s64 vlag;u64 vprot; - }; +// }; u64 slice;u64 nr_migrations;
Of course I meant the patch below. :-/
Thanks,
Ingo
===================================>
From: Ingo Molnar <[email protected]>
Date: Wed, 26 Nov 2025 05:31:28 +0100
Subject: [PATCH] sched/fair: Separate se->vlag from se->vprot
There's no real space concerns here and keeping these fields in a union makes reading (and tracing) the scheduler code harder.
--- include/linux/sched.h | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-)
include/linux/sched.h +4 -9
@@ -586,15 +586,10 @@ struct sched_entity {u64 sum_exec_runtime;u64 prev_sum_exec_runtime;u64 vruntime; -union { -/* -* When !@on_rq this field is vlag. -* When cfs_rq->curr == se (which implies @on_rq) -* this field is vprot. See protect_slice(). -*/ -s64 vlag; -u64 vprot; - }; +/* Approximated virtual lag: */ +s64 vlag; +/* 'Protected' deadline, to give out minimum quantums: */ +u64 vprot;u64 slice;u64 nr_migrations;
[tip: sched/core] sched/fair: Separate se->vlag from se->vprot
In reply to Ingo MolnarThe following commit has been merged into the sched/core branch of tip:
The following commit has been merged into the sched/core branch of tip:
Commit-ID: 6b6d09f274bd6e5bed2751b3cab23e64f19c9e59 Gitweb: https://git.kernel.org/tip/6b6d09f274bd6e5bed2751b3cab23e64f19c9e59 Author: Ingo Molnar <[email protected]> AuthorDate: Wed, 26 Nov 2025 05:31:28 +01:00 Committer: Ingo Molnar <[email protected]> CommitterDate: Sun, 14 Dec 2025 08:25:02 +01:00
sched/fair: Separate se->vlag from se->vprot
There's no real space concerns here and keeping these fields in a union makes reading (and tracing) the scheduler code harder.
--- include/linux/sched.h | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-)
include/linux/sched.h +4 -9
@@ -586,15 +586,10 @@ struct sched_entity {u64 sum_exec_runtime;u64 prev_sum_exec_runtime;u64 vruntime; -union { -/* -* When !@on_rq this field is vlag. -* When cfs_rq->curr == se (which implies @on_rq) -* this field is vprot. See protect_slice(). -*/ -s64 vlag; -u64 vprot; - }; +/* Approximated virtual lag: */ +s64 vlag; +/* 'Protected' deadline, to give out minimum quantums: */ +u64 vprot;u64 slice;u64 nr_migrations;
[tip: sched/core] sched/fair: Separate se->vlag from se->vprot
In reply to Ingo MolnarThe following commit has been merged into the sched/core branch of tip:
The following commit has been merged into the sched/core branch of tip:
Commit-ID: 80390ead2080071cbd6f427ff8deb94d10a4a50f Gitweb: https://git.kernel.org/tip/80390ead2080071cbd6f427ff8deb94d10a4a50f Author: Ingo Molnar <[email protected]> AuthorDate: Wed, 26 Nov 2025 05:31:28 +01:00 Committer: Ingo Molnar <[email protected]> CommitterDate: Mon, 15 Dec 2025 07:52:44 +01:00
sched/fair: Separate se->vlag from se->vprot
There's no real space concerns here and keeping these fields in a union makes reading (and tracing) the scheduler code harder.
--- include/linux/sched.h | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-)
include/linux/sched.h +4 -9
@@ -586,15 +586,10 @@ struct sched_entity {u64 sum_exec_runtime;u64 prev_sum_exec_runtime;u64 vruntime; -union { -/* -* When !@on_rq this field is vlag. -* When cfs_rq->curr == se (which implies @on_rq) -* this field is vprot. See protect_slice(). -*/ -s64 vlag; -u64 vprot; - }; +/* Approximated virtual lag: */ +s64 vlag; +/* 'Protected' deadline, to give out minimum quantums: */ +u64 vprot;u64 slice;u64 nr_migrations;
PATCH 4/6 sched/fair: Rename avg_vruntime() to cfs_avg_vruntime()
In reply to Ingo MolnarSince the unit of the ->avg_vruntime field isn't actually the same thing as the avg_vruntime() result, reduce confusion and rename the latter to the common cfs_*() nomenclature of visible global functions of the fair scheduler.
--- kernel/sched/debug.c | 2 +- kernel/sched/fair.c | 10 +++++----- kernel/sched/sched.h | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-)
kernel/sched/debug.c +1 -1
@@ -829,7 +829,7 @@ void print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq)SEQ_printf (m," .%-30s: %Ld.%06ld\n" ,"zero_vruntime" ,SPLIT_NS (zero_vruntime));SEQ_printf (m," .%-30s: %Ld.%06ld\n" ,"avg_vruntime" , -SPLIT_NS (avg_vruntime (cfs_rq))); +SPLIT_NS (cfs_avg_vruntime (cfs_rq)));SEQ_printf (m," .%-30s: %Ld.%06ld\n" ,"right_vruntime" ,SPLIT_NS (right_vruntime)); spread = right_vruntime - left_vruntime;
kernel/sched/fair.c +5 -5
@@ -651,7 +651,7 @@ void avg_vruntime_update(struct cfs_rq *cfs_rq, s64 delta)* Specifically: avg_runtime() + 0 must result in entity_eligible() := true * For this to be so, the result of this function must have a left bias. */ -u64 avg_vruntime (struct cfs_rq *cfs_rq) +u64 cfs_avg_vruntime (struct cfs_rq *cfs_rq) {struct sched_entity *curr = cfs_rq->curr;s64 avg = cfs_rq->avg_vruntime;
@@ -696,7 +696,7 @@ static void update_entity_lag(struct cfs_rq *cfs_rq, struct sched_entity *se)WARN_ON_ONCE (!se->on_rq); - vlag =avg_vruntime (cfs_rq) - se->vruntime; + vlag =cfs_avg_vruntime (cfs_rq) - se->vruntime; limit =calc_delta_fair (max_t (u64,2 *se->slice,TICK_NSEC ), se); se->vlag =clamp (vlag, -limit, limit);
@@ -716,7 +716,7 @@ static void update_entity_lag(struct cfs_rq *cfs_rq, struct sched_entity *se)* * lag_i >= 0 -> \Sum (v_i - v)*w_i >= (v_i - v)*(\Sum w_i) * -* Note: using 'avg_vruntime() > se->vruntime' is inaccurate due +* Note: using 'cfs_avg_vruntime() > se->vruntime' is inaccurate due * to the loss in precision caused by the division. */ static int vruntime_eligible (struct cfs_rq *cfs_rq,u64 vruntime)
@@ -742,7 +742,7 @@ int entity_eligible(struct cfs_rq *cfs_rq, struct sched_entity *se)static void update_zero_vruntime (struct cfs_rq *cfs_rq) { -u64 vruntime =avg_vruntime (cfs_rq); +u64 vruntime =cfs_avg_vruntime (cfs_rq);s64 delta = (s64)(vruntime - cfs_rq->zero_vruntime);avg_vruntime_update (cfs_rq, delta);
@@ -5099,7 +5099,7 @@ void __setparam_fair(struct task_struct *p, const struct sched_attr *attr)static void place_entity (struct cfs_rq *cfs_rq,struct sched_entity *se,int flags) { -u64 vslice, vruntime =avg_vruntime (cfs_rq); +u64 vslice, vruntime =cfs_avg_vruntime (cfs_rq);s64 lag =0 ;if (!se->custom_slice)
kernel/sched/sched.h +1 -1
@@ -3956,7 +3956,7 @@ static inline void task_tick_mm_cid(struct rq *rq, struct task_struct *curr) { }static inline void init_sched_mm_cid (struct task_struct *t) { }#endif /* !CONFIG_SCHED_MM_CID */ -extern u64 avg_vruntime (struct cfs_rq *cfs_rq); +extern u64 cfs_avg_vruntime (struct cfs_rq *cfs_rq);extern int entity_eligible (struct cfs_rq *cfs_rq,struct sched_entity *se);static inline void move_queued_task_locked (struct rq *src_rq,struct rq *dst_rq,struct task_struct *task)
Signature · 1 line
2.51.0
Peter Zijlstra
maintainerRe: [PATCH 4/6] sched/fair: Rename avg_vruntime() to cfs_avg_vruntime()
Quoted 4 lines · Ingo Molnar
Since the unit of the ->avg_vruntime field isn't actually the same thing as the
avg_vruntime()result, reduce confusion and rename the latter to the common cfs_*() nomenclature of visible global functions of the fair scheduler.
But you're going to rename both those fields into sum_weight and sum_w_vruntime freeing up the avg_vruntime name and clearing up the above confusion.
So why then still rename the thing? The result of the function really is the (weighted) average of the vruntime, so the naming isn't confusing or bad (unlike the variables it uses, which are pretty badly named).
Re: [PATCH 4/6] sched/fair: Rename avg_vruntime() to cfs_avg_vruntime()
Quoted 9 lines · Peter Zijlstra
Quoted 4 lines · Ingo Molnar
Since the unit of the ->avg_vruntime field isn't actually the same thing as the
avg_vruntime()result, reduce confusion and rename the latter to the common cfs_*() nomenclature of visible global functions of the fair scheduler.But you're going to rename both those fields into
sum_weightandsum_w_vruntimefreeing up theavg_vruntimename and clearing up the above confusion.
Ah, indeed and agreed - I dropped this patch.
Thanks,
Ingo
PATCH 5/6 sched/fair: Rename cfs_rq::avg_load to cfs_rq::sum_weight
In reply to Ingo MolnarThe ::avg_load field is a long-standing misnomer: it says it's an 'average load', but in reality it's the momentary sum of the load of all currently runnable tasks. We'd have to also perform a division by nr_running (or use time-decay) to arrive at any sort of average value.
This is clear from comments about the math of fair scheduling:
* \Sum w_i := cfs_rq->avg_load
The sum of all weights is ... the sum of all weights, not the average of all weights.
To make it doubly confusing, there's also an ::avg_load in the load-balancing struct sg_lb_stats, which *is* a true average.
The second part of the field's name is a minor misnomer as well: it says 'load', and it is indeed a load_weight structure as it shares code with the load-balancer - but it's only in an SMP load-balancing context where load = weight, in the fair scheduling context the primary purpose is the weighting of different nice levels.
So rename the field to ::sum_weight instead, which makes the terminology of the EEVDF math match up with our implementation of it:
* \Sum w_i := cfs_rq->sum_weight
--- kernel/sched/fair.c | 16 ++++++++-------- kernel/sched/sched.h | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-)
kernel/sched/fair.c +8 -8
@@ -608,7 +608,7 @@ static inline s64 entity_key(struct cfs_rq *cfs_rq, struct sched_entity *se)* * v0 := cfs_rq->zero_vruntime * \Sum (v_i - v0) * w_i := cfs_rq->avg_vruntime -* \Sum w_i := cfs_rq->avg_load +* \Sum w_i := cfs_rq->sum_weight * * Since zero_vruntime closely tracks the per-task service, these * deltas: (v_i - v), will be in the order of the maximal (virtual) lag
@@ -625,7 +625,7 @@ avg_vruntime_add(struct cfs_rq *cfs_rq, struct sched_entity *se)s64 key =entity_key (cfs_rq, se); cfs_rq->avg_vruntime += key * weight; - cfs_rq->avg_load += weight; + cfs_rq->sum_weight += weight; } static void
@@ -635,16 +635,16 @@ avg_vruntime_sub(struct cfs_rq *cfs_rq, struct sched_entity *se)s64 key =entity_key (cfs_rq, se); cfs_rq->avg_vruntime -= key * weight; - cfs_rq->avg_load -= weight; + cfs_rq->sum_weight -= weight; }static inline void avg_vruntime_update (struct cfs_rq *cfs_rq,s64 delta) {/* -* v' = v + d ==> avg_vruntime' = avg_runtime - d*avg_load +* v' = v + d ==> avg_vruntime' = avg_runtime - d*sum_weight */ - cfs_rq->avg_vruntime -= cfs_rq->avg_load * delta; + cfs_rq->avg_vruntime -= cfs_rq->sum_weight * delta; }/*
@@ -655,7 +655,7 @@ u64 cfs_avg_vruntime(struct cfs_rq *cfs_rq) {struct sched_entity *curr = cfs_rq->curr;s64 avg = cfs_rq->avg_vruntime; -long load = cfs_rq->avg_load; +long load = cfs_rq->sum_weight;if (curr && curr->on_rq) {unsigned long weight =scale_load_down (curr->load.weight);
@@ -723,7 +723,7 @@ static int vruntime_eligible(struct cfs_rq *cfs_rq, u64 vruntime) {struct sched_entity *curr = cfs_rq->curr;s64 avg = cfs_rq->avg_vruntime; -long load = cfs_rq->avg_load; +long load = cfs_rq->sum_weight;if (curr && curr->on_rq) {unsigned long weight =scale_load_down (curr->load.weight);
@@ -5172,7 +5172,7 @@ place_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags)* * vl_i = (W + w_i)*vl'_i / W */ - load = cfs_rq->avg_load; + load = cfs_rq->sum_weight;if (curr && curr->on_rq) load +=scale_load_down (curr->load.weight);
kernel/sched/sched.h +1 -1
@@ -679,7 +679,7 @@ struct cfs_rq {unsigned int h_nr_idle;/* SCHED_IDLE */ s64 avg_vruntime; -u64 avg_load; +u64 sum_weight;u64 zero_vruntime;#ifdef CONFIG_SCHED_CORE
Signature · 1 line
2.51.0
Peter Zijlstra
maintainerRe: [PATCH 5/6] sched/fair: Rename cfs_rq::avg_load to cfs_rq::sum_weight
Quoted 24 lines · Ingo Molnar
The ::avg_load field is a long-standing misnomer: it says it's an 'average load', but in reality it's the momentary sum of the load of all currently runnable tasks. We'd have to also perform a division by
nr_running(or use time-decay) to arrive at any sort of average value.This is clear from comments about the math of fair scheduling:
* \Sum
w_i:=cfs_rq->avg_loadThe sum of all weights is ... the sum of all weights, not the average of all weights.
To make it doubly confusing, there's also an ::avg_load in the load-balancing struct
sg_lb_stats, which *is* a true average.The second part of the field's name is a minor misnomer as well: it says 'load', and it is indeed a
load_weightstructure as it shares code with the load-balancer - but it's only in an SMP load-balancing context where load = weight, in the fair scheduling context the primary purpose is the weighting of different nice levels.
Quoted 7 lines
So rename the field to ::sum_weight instead, which makes the terminology of the EEVDF math match up with our implementation of it:
* \Sum
w_i:=cfs_rq->sum_weightSigned-off-by Ingo Molnar <[email protected]>
Bah, this is going to be a pain rebasing for me, but yes, these variables are poorly named. 'sum_weight' is a better name.
Quoted 90 lines
--- kernel/sched/fair.c | 16 ++++++++-------- kernel/sched/sched.h | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-)kernel/sched/fair.c +8
-8@@ -608,7 +608,7 @@ static inline s64 entity_key(struct cfs_rq *cfs_rq, struct sched_entity *se)* * v0 := cfs_rq->zero_vruntime * \Sum (v_i - v0) * w_i := cfs_rq->avg_vruntime -* \Sum w_i := cfs_rq->avg_load +* \Sum w_i := cfs_rq->sum_weight * * Since zero_vruntime closely tracks the per-task service, these * deltas: (v_i - v), will be in the order of the maximal (virtual) lag @@ -625,7 +625,7 @@ avg_vruntime_add(struct cfs_rq *cfs_rq, struct sched_entity *se)s64 key =entity_key (cfs_rq, se); cfs_rq->avg_vruntime += key * weight; - cfs_rq->avg_load += weight; + cfs_rq->sum_weight += weight; } static void@@ -635,16 +635,16 @@ avg_vruntime_sub(struct cfs_rq *cfs_rq, struct sched_entity *se)s64 key =entity_key (cfs_rq, se); cfs_rq->avg_vruntime -= key * weight; - cfs_rq->avg_load -= weight; + cfs_rq->sum_weight -= weight; }static inline void avg_vruntime_update (struct cfs_rq *cfs_rq,s64 delta) {/* -* v' = v + d ==> avg_vruntime' = avg_runtime - d*avg_load +* v' = v + d ==> avg_vruntime' = avg_runtime - d*sum_weight */ - cfs_rq->avg_vruntime -= cfs_rq->avg_load * delta; + cfs_rq->avg_vruntime -= cfs_rq->sum_weight * delta; }/* @@ -655,7 +655,7 @@ u64 cfs_avg_vruntime(struct cfs_rq *cfs_rq) {struct sched_entity *curr = cfs_rq->curr;s64 avg = cfs_rq->avg_vruntime; -long load = cfs_rq->avg_load; +long load = cfs_rq->sum_weight;if (curr && curr->on_rq) {unsigned long weight =scale_load_down (curr->load.weight);@@ -723,7 +723,7 @@ static int vruntime_eligible(struct cfs_rq *cfs_rq, u64 vruntime) {struct sched_entity *curr = cfs_rq->curr;s64 avg = cfs_rq->avg_vruntime; -long load = cfs_rq->avg_load; +long load = cfs_rq->sum_weight;if (curr && curr->on_rq) {unsigned long weight =scale_load_down (curr->load.weight);@@ -5172,7 +5172,7 @@ place_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags)* * vl_i = (W + w_i)*vl'_i / W */ - load = cfs_rq->avg_load; + load = cfs_rq->sum_weight;if (curr && curr->on_rq) load +=scale_load_down (curr->load.weight);kernel/sched/sched.h +1
-1@@ -679,7 +679,7 @@ struct cfs_rq {unsigned int h_nr_idle;/* SCHED_IDLE */ s64 avg_vruntime; -u64 avg_load; +u64 sum_weight;u64 zero_vruntime;#ifdef CONFIG_SCHED_CORE Signature · 1 line
2.51.0
Re: [PATCH 5/6] sched/fair: Rename cfs_rq::avg_load to cfs_rq::sum_weight
Quoted 29 lines · Peter Zijlstra
Quoted 28 lines · Ingo Molnar
The ::avg_load field is a long-standing misnomer: it says it's an 'average load', but in reality it's the momentary sum of the load of all currently runnable tasks. We'd have to also perform a division by
nr_running(or use time-decay) to arrive at any sort of average value.This is clear from comments about the math of fair scheduling:
* \Sum
w_i:=cfs_rq->avg_loadThe sum of all weights is ... the sum of all weights, not the average of all weights.
To make it doubly confusing, there's also an ::avg_load in the load-balancing struct
sg_lb_stats, which *is* a true average.The second part of the field's name is a minor misnomer as well: it says 'load', and it is indeed a
load_weightstructure as it shares code with the load-balancer - but it's only in an SMP load-balancing context where load = weight, in the fair scheduling context the primary purpose is the weighting of different nice levels.So rename the field to ::sum_weight instead, which makes the terminology of the EEVDF math match up with our implementation of it:
Quoted 6 lines
Quoted 3 lines
* \Sum
w_i:=cfs_rq->sum_weightSigned-off-by Ingo Molnar <[email protected]>Bah, this is going to be a pain rebasing for me, but yes, these variables are poorly named. '
sum_weight' is a better name.
Fair enough, and to make this easier for you I've rebased your worst affected tree (queue.git:sched/flat) on top of the mingo/tip:WIP.sched/core-for-v6.20 tree, which includes these renames (with all your feedback addressed AFAICT), see:
git://git.kernel.org/pub/scm/linux/kernel/git/mingo/tip.git WIP.sched/flat
... and it builds and boots. :-)
Thanks,
Ingo
[tip: sched/core] sched/fair: Rename cfs_rq::avg_load to cfs_rq::sum_weight
In reply to Ingo MolnarThe following commit has been merged into the sched/core branch of tip:
The following commit has been merged into the sched/core branch of tip:
Commit-ID: 969c658869ff1c3998a449d2602c68b1d4b1ce06 Gitweb: https://git.kernel.org/tip/969c658869ff1c3998a449d2602c68b1d4b1ce06 Author: Ingo Molnar <[email protected]> AuthorDate: Wed, 26 Nov 2025 12:09:16 +01:00 Committer: Ingo Molnar <[email protected]> CommitterDate: Sun, 14 Dec 2025 08:25:03 +01:00
sched/fair: Rename cfs_rq::avg_load to cfs_rq::sum_weight
The ::avg_load field is a long-standing misnomer: it says it's an 'average load', but in reality it's the momentary sum of the load of all currently runnable tasks. We'd have to also perform a division by nr_running (or use time-decay) to arrive at any sort of average value.
This is clear from comments about the math of fair scheduling:
* \Sum w_i := cfs_rq->avg_load
The sum of all weights is ... the sum of all weights, not the average of all weights.
To make it doubly confusing, there's also an ::avg_load in the load-balancing struct sg_lb_stats, which *is* a true average.
The second part of the field's name is a minor misnomer as well: it says 'load', and it is indeed a load_weight structure as it shares code with the load-balancer - but it's only in an SMP load-balancing context where load = weight, in the fair scheduling context the primary purpose is the weighting of different nice levels.
So rename the field to ::sum_weight instead, which makes the terminology of the EEVDF math match up with our implementation of it:
* \Sum w_i := cfs_rq->sum_weight
--- kernel/sched/fair.c | 16 ++++++++-------- kernel/sched/sched.h | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-)
kernel/sched/fair.c +8 -8
@@ -608,7 +608,7 @@ static inline s64 entity_key(struct cfs_rq *cfs_rq, struct sched_entity *se)* * v0 := cfs_rq->zero_vruntime * \Sum (v_i - v0) * w_i := cfs_rq->avg_vruntime -* \Sum w_i := cfs_rq->avg_load +* \Sum w_i := cfs_rq->sum_weight * * Since zero_vruntime closely tracks the per-task service, these * deltas: (v_i - v), will be in the order of the maximal (virtual) lag
@@ -625,7 +625,7 @@ avg_vruntime_add(struct cfs_rq *cfs_rq, struct sched_entity *se)s64 key =entity_key (cfs_rq, se); cfs_rq->avg_vruntime += key * weight; - cfs_rq->avg_load += weight; + cfs_rq->sum_weight += weight; } static void
@@ -635,16 +635,16 @@ avg_vruntime_sub(struct cfs_rq *cfs_rq, struct sched_entity *se)s64 key =entity_key (cfs_rq, se); cfs_rq->avg_vruntime -= key * weight; - cfs_rq->avg_load -= weight; + cfs_rq->sum_weight -= weight; }static inline void avg_vruntime_update (struct cfs_rq *cfs_rq,s64 delta) {/* -* v' = v + d ==> avg_vruntime' = avg_runtime - d*avg_load +* v' = v + d ==> avg_vruntime' = avg_runtime - d*sum_weight */ - cfs_rq->avg_vruntime -= cfs_rq->avg_load * delta; + cfs_rq->avg_vruntime -= cfs_rq->sum_weight * delta; }/*
@@ -655,7 +655,7 @@ u64 avg_vruntime(struct cfs_rq *cfs_rq) {struct sched_entity *curr = cfs_rq->curr;s64 avg = cfs_rq->avg_vruntime; -long load = cfs_rq->avg_load; +long load = cfs_rq->sum_weight;if (curr && curr->on_rq) {unsigned long weight =scale_load_down (curr->load.weight);
@@ -723,7 +723,7 @@ static int vruntime_eligible(struct cfs_rq *cfs_rq, u64 vruntime) {struct sched_entity *curr = cfs_rq->curr;s64 avg = cfs_rq->avg_vruntime; -long load = cfs_rq->avg_load; +long load = cfs_rq->sum_weight;if (curr && curr->on_rq) {unsigned long weight =scale_load_down (curr->load.weight);
@@ -5131,7 +5131,7 @@ place_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags)* * vl_i = (W + w_i)*vl'_i / W */ - load = cfs_rq->avg_load; + load = cfs_rq->sum_weight;if (curr && curr->on_rq) load +=scale_load_down (curr->load.weight);
kernel/sched/sched.h +1 -1
@@ -679,7 +679,7 @@ struct cfs_rq {unsigned int h_nr_idle;/* SCHED_IDLE */ s64 avg_vruntime; -u64 avg_load; +u64 sum_weight;u64 zero_vruntime;#ifdef CONFIG_SCHED_CORE
[tip: sched/core] sched/fair: Rename cfs_rq::avg_load to cfs_rq::sum_weight
In reply to Ingo MolnarThe following commit has been merged into the sched/core branch of tip:
The following commit has been merged into the sched/core branch of tip:
Commit-ID: 4ff674fa986c27ec8a0542479258c92d361a2566 Gitweb: https://git.kernel.org/tip/4ff674fa986c27ec8a0542479258c92d361a2566 Author: Ingo Molnar <[email protected]> AuthorDate: Wed, 26 Nov 2025 12:09:16 +01:00 Committer: Ingo Molnar <[email protected]> CommitterDate: Mon, 15 Dec 2025 07:52:44 +01:00
sched/fair: Rename cfs_rq::avg_load to cfs_rq::sum_weight
The ::avg_load field is a long-standing misnomer: it says it's an 'average load', but in reality it's the momentary sum of the load of all currently runnable tasks. We'd have to also perform a division by nr_running (or use time-decay) to arrive at any sort of average value.
This is clear from comments about the math of fair scheduling:
* \Sum w_i := cfs_rq->avg_load
The sum of all weights is ... the sum of all weights, not the average of all weights.
To make it doubly confusing, there's also an ::avg_load in the load-balancing struct sg_lb_stats, which *is* a true average.
The second part of the field's name is a minor misnomer as well: it says 'load', and it is indeed a load_weight structure as it shares code with the load-balancer - but it's only in an SMP load-balancing context where load = weight, in the fair scheduling context the primary purpose is the weighting of different nice levels.
So rename the field to ::sum_weight instead, which makes the terminology of the EEVDF math match up with our implementation of it:
* \Sum w_i := cfs_rq->sum_weight
--- kernel/sched/fair.c | 16 ++++++++-------- kernel/sched/sched.h | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-)
kernel/sched/fair.c +8 -8
@@ -608,7 +608,7 @@ static inline s64 entity_key(struct cfs_rq *cfs_rq, struct sched_entity *se)* * v0 := cfs_rq->zero_vruntime * \Sum (v_i - v0) * w_i := cfs_rq->avg_vruntime -* \Sum w_i := cfs_rq->avg_load +* \Sum w_i := cfs_rq->sum_weight * * Since zero_vruntime closely tracks the per-task service, these * deltas: (v_i - v), will be in the order of the maximal (virtual) lag
@@ -625,7 +625,7 @@ avg_vruntime_add(struct cfs_rq *cfs_rq, struct sched_entity *se)s64 key =entity_key (cfs_rq, se); cfs_rq->avg_vruntime += key * weight; - cfs_rq->avg_load += weight; + cfs_rq->sum_weight += weight; } static void
@@ -635,16 +635,16 @@ avg_vruntime_sub(struct cfs_rq *cfs_rq, struct sched_entity *se)s64 key =entity_key (cfs_rq, se); cfs_rq->avg_vruntime -= key * weight; - cfs_rq->avg_load -= weight; + cfs_rq->sum_weight -= weight; }static inline void avg_vruntime_update (struct cfs_rq *cfs_rq,s64 delta) {/* -* v' = v + d ==> avg_vruntime' = avg_runtime - d*avg_load +* v' = v + d ==> avg_vruntime' = avg_runtime - d*sum_weight */ - cfs_rq->avg_vruntime -= cfs_rq->avg_load * delta; + cfs_rq->avg_vruntime -= cfs_rq->sum_weight * delta; }/*
@@ -655,7 +655,7 @@ u64 avg_vruntime(struct cfs_rq *cfs_rq) {struct sched_entity *curr = cfs_rq->curr;s64 avg = cfs_rq->avg_vruntime; -long load = cfs_rq->avg_load; +long load = cfs_rq->sum_weight;if (curr && curr->on_rq) {unsigned long weight =scale_load_down (curr->load.weight);
@@ -723,7 +723,7 @@ static int vruntime_eligible(struct cfs_rq *cfs_rq, u64 vruntime) {struct sched_entity *curr = cfs_rq->curr;s64 avg = cfs_rq->avg_vruntime; -long load = cfs_rq->avg_load; +long load = cfs_rq->sum_weight;if (curr && curr->on_rq) {unsigned long weight =scale_load_down (curr->load.weight);
@@ -5131,7 +5131,7 @@ place_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags)* * vl_i = (W + w_i)*vl'_i / W */ - load = cfs_rq->avg_load; + load = cfs_rq->sum_weight;if (curr && curr->on_rq) load +=scale_load_down (curr->load.weight);
kernel/sched/sched.h +1 -1
@@ -679,7 +679,7 @@ struct cfs_rq {unsigned int h_nr_idle;/* SCHED_IDLE */ s64 avg_vruntime; -u64 avg_load; +u64 sum_weight;u64 zero_vruntime;#ifdef CONFIG_SCHED_CORE
PATCH 6/6 sched/fair: Rename cfs_rq::avg_vruntime to ::sum_w_vruntime, and helper functions
In reply to Ingo MolnarThe ::avg_vruntime field is a misnomer: it says it's an 'average vruntime', but in reality it's the momentary sum of the weighted vruntimes of all queued tasks, which is at least a division away from being an average.
This is clear from comments about the math of fair scheduling:
* \Sum (v_i - v0) * w_i := cfs_rq->avg_vruntime
This confusion is increased by the cfs_avg_vruntime() function, which does perform the division and returns a true average.
The sum of all weighted vruntimes should be named thusly, so rename the field to ::sum_w_vruntime. (As arguably ::sum_weighted_vruntime would be a bit of a mouthful.)
Understanding the scheduler is hard enough already, without extra layers of obfuscated naming. ;-)
Also rename related helper functions:
sum_vruntime_add() => sum_w_vruntime_add()
sum_vruntime_sub() => sum_w_vruntime_sub()
sum_vruntime_update() => sum_w_vruntime_update()
With the notable exception of cfs_avg_vruntime(), which was named accurately.
--- kernel/sched/debug.c | 2 +- kernel/sched/fair.c | 26 +++++++++++++------------- kernel/sched/sched.h | 2 +- 3 files changed, 15 insertions(+), 15 deletions(-)
kernel/sched/debug.c +1 -1
@@ -828,7 +828,7 @@ void print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq) SPLIT_NS(left_vruntime));SEQ_printf (m," .%-30s: %Ld.%06ld\n" ,"zero_vruntime" ,SPLIT_NS (zero_vruntime)); -SEQ_printf (m," .%-30s: %Ld.%06ld\n" ,"avg_vruntime" , +SEQ_printf (m," .%-30s: %Ld.%06ld\n" ,"sum_w_vruntime" ,SPLIT_NS (cfs_avg_vruntime (cfs_rq)));SEQ_printf (m," .%-30s: %Ld.%06ld\n" ,"right_vruntime" ,SPLIT_NS (right_vruntime));
kernel/sched/fair.c +13 -13
@@ -607,7 +607,7 @@ static inline s64 entity_key(struct cfs_rq *cfs_rq, struct sched_entity *se)* Which we track using: * * v0 := cfs_rq->zero_vruntime -* \Sum (v_i - v0) * w_i := cfs_rq->avg_vruntime +* \Sum (v_i - v0) * w_i := cfs_rq->sum_w_vruntime * \Sum w_i := cfs_rq->sum_weight * * Since zero_vruntime closely tracks the per-task service, these
@@ -619,32 +619,32 @@ static inline s64 entity_key(struct cfs_rq *cfs_rq, struct sched_entity *se)* As measured, the max (key * weight) value was ~44 bits for a kernel build. */ static void -avg_vruntime_add (struct cfs_rq *cfs_rq,struct sched_entity *se) +sum_w_vruntime_add (struct cfs_rq *cfs_rq,struct sched_entity *se) {unsigned long weight =scale_load_down (se->load.weight);s64 key =entity_key (cfs_rq, se); - cfs_rq->avg_vruntime += key * weight; + cfs_rq->sum_w_vruntime += key * weight; cfs_rq->sum_weight += weight; }static void -avg_vruntime_sub (struct cfs_rq *cfs_rq,struct sched_entity *se) +sum_w_vruntime_sub (struct cfs_rq *cfs_rq,struct sched_entity *se) {unsigned long weight =scale_load_down (se->load.weight);s64 key =entity_key (cfs_rq, se); - cfs_rq->avg_vruntime -= key * weight; + cfs_rq->sum_w_vruntime -= key * weight; cfs_rq->sum_weight -= weight; }static inline -void avg_vruntime_update (struct cfs_rq *cfs_rq,s64 delta) +void sum_w_vruntime_update (struct cfs_rq *cfs_rq,s64 delta) {/* -* v' = v + d ==> avg_vruntime' = avg_runtime - d*sum_weight +* v' = v + d ==> sum_w_vruntime' = sum_runtime - d*sum_weight */ - cfs_rq->avg_vruntime -= cfs_rq->sum_weight * delta; + cfs_rq->sum_w_vruntime -= cfs_rq->sum_weight * delta; }/*
@@ -654,7 +654,7 @@ void avg_vruntime_update(struct cfs_rq *cfs_rq, s64 delta)u64 cfs_avg_vruntime (struct cfs_rq *cfs_rq) {struct sched_entity *curr = cfs_rq->curr; -s64 avg = cfs_rq->avg_vruntime; +s64 avg = cfs_rq->sum_w_vruntime;long load = cfs_rq->sum_weight;if (curr && curr->on_rq) {
@@ -722,7 +722,7 @@ static void update_entity_lag(struct cfs_rq *cfs_rq, struct sched_entity *se)static int vruntime_eligible (struct cfs_rq *cfs_rq,u64 vruntime) {struct sched_entity *curr = cfs_rq->curr; -s64 avg = cfs_rq->avg_vruntime; +s64 avg = cfs_rq->sum_w_vruntime;long load = cfs_rq->sum_weight;if (curr && curr->on_rq) {
@@ -745,7 +745,7 @@ static void update_zero_vruntime(struct cfs_rq *cfs_rq)u64 vruntime =cfs_avg_vruntime (cfs_rq);s64 delta = (s64)(vruntime - cfs_rq->zero_vruntime); -avg_vruntime_update (cfs_rq, delta); +sum_w_vruntime_update (cfs_rq, delta); cfs_rq->zero_vruntime = vruntime; }
@@ -819,7 +819,7 @@ RB_DECLARE_CALLBACKS(static, min_vruntime_cb, struct sched_entity,*/ static void __enqueue_entity (struct cfs_rq *cfs_rq,struct sched_entity *se) { -avg_vruntime_add (cfs_rq, se); +sum_w_vruntime_add (cfs_rq, se);update_zero_vruntime (cfs_rq); se->min_vruntime = se->vruntime; se->min_slice = se->slice;
@@ -831,7 +831,7 @@ static void __dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se) {rb_erase_augmented_cached (&se->run_node, &cfs_rq->tasks_timeline, &min_vruntime_cb); -avg_vruntime_sub (cfs_rq, se); +sum_w_vruntime_sub (cfs_rq, se);update_zero_vruntime (cfs_rq); }
kernel/sched/sched.h +1 -1
@@ -678,7 +678,7 @@ struct cfs_rq {unsigned int h_nr_runnable;/* SCHED_{NORMAL,BATCH,IDLE} */ unsigned int h_nr_idle;/* SCHED_IDLE */ -s64 avg_vruntime; +s64 sum_w_vruntime;u64 sum_weight;u64 zero_vruntime;
Signature · 1 line
2.51.0
Peter Zijlstra
maintainerRe: [PATCH 6/6] sched/fair: Rename cfs_rq::avg_vruntime to ::sum_w_vruntime, and helper functions
Quoted 16 lines · Ingo Molnar
The ::avg_vruntime field is a misnomer: it says it's an 'average vruntime', but in reality it's the momentary sum of the weighted vruntimes of all queued tasks, which is at least a division away from being an average.
This is clear from comments about the math of fair scheduling:
* \Sum (
v_i- v0) *w_i:=cfs_rq->avg_vruntimeThis confusion is increased by the
cfs_avg_vruntime()function, which does perform the division and returns a true average.The sum of all weighted vruntimes should be named thusly, so rename the field to ::sum_w_vruntime. (As arguably ::sum_weighted_vruntime would be a bit of a mouthful.)
Quoted 8 lines
Understanding the scheduler is hard enough already, without extra layers of obfuscated naming. ;-)
Also rename related helper functions:
sum_vruntime_add()=>sum_w_vruntime_add()
sum_vruntime_sub()=>sum_w_vruntime_sub()
sum_vruntime_update()=>sum_w_vruntime_update()
So vruntime := runtime / w, so w*vruntime is runtime again. I'm sure there's something there.
/me runs.
But yeah no arguments this naming needs help.
Quoted 2 lines
With the notable exception of
cfs_avg_vruntime(), which was named accurately.
But the old avg_vruntime() name was good too!
Re: [PATCH 6/6] sched/fair: Rename cfs_rq::avg_vruntime to ::sum_w_vruntime, and helper functions
Quoted 20 lines · Peter Zijlstra
Quoted 19 lines · Ingo Molnar
The ::avg_vruntime field is a misnomer: it says it's an 'average vruntime', but in reality it's the momentary sum of the weighted vruntimes of all queued tasks, which is at least a division away from being an average.
This is clear from comments about the math of fair scheduling:
* \Sum (
v_i- v0) *w_i:=cfs_rq->avg_vruntimeThis confusion is increased by the
cfs_avg_vruntime()function, which does perform the division and returns a true average.The sum of all weighted vruntimes should be named thusly, so rename the field to ::sum_w_vruntime. (As arguably ::sum_weighted_vruntime would be a bit of a mouthful.)
Understanding the scheduler is hard enough already, without extra layers of obfuscated naming. ;-)
Quoted 8 lines
Quoted 5 lines
Also rename related helper functions:
sum_vruntime_add()=>sum_w_vruntime_add()
sum_vruntime_sub()=>sum_w_vruntime_sub()
sum_vruntime_update()=>sum_w_vruntime_update()So vruntime := runtime / w, so w*vruntime is runtime again. I'm sure there's something there.
Haha, yes. It's delta_exec all the way down, and turtles.
Quoted 8 lines
/me runs.
But yeah no arguments this naming needs help.
Quoted 2 lines
With the notable exception of
cfs_avg_vruntime(), which was named accurately.But the old
avg_vruntime()name was good too!
Yeah. It's now restored in its old glory. :-)
Thanks,
Ingo
[tip: sched/core] sched/fair: Rename cfs_rq::avg_vruntime to ::sum_w_vruntime, and helper functions
In reply to Ingo MolnarThe following commit has been merged into the sched/core branch of tip:
The following commit has been merged into the sched/core branch of tip:
Commit-ID: 8e9aa35061d3fc0b5ab4e9b6247a0dfa600212eb Gitweb: https://git.kernel.org/tip/8e9aa35061d3fc0b5ab4e9b6247a0dfa600212eb Author: Ingo Molnar <[email protected]> AuthorDate: Tue, 02 Dec 2025 16:09:23 +01:00 Committer: Ingo Molnar <[email protected]> CommitterDate: Sun, 14 Dec 2025 08:25:03 +01:00
sched/fair: Rename cfs_rq::avg_vruntime to ::sum_w_vruntime, and helper functions
The ::avg_vruntime field is a misnomer: it says it's an 'average vruntime', but in reality it's the momentary sum of the weighted vruntimes of all queued tasks, which is at least a division away from being an average.
This is clear from comments about the math of fair scheduling:
* \Sum (v_i - v0) * w_i := cfs_rq->avg_vruntime
This confusion is increased by the cfs_avg_vruntime() function, which does perform the division and returns a true average.
The sum of all weighted vruntimes should be named thusly, so rename the field to ::sum_w_vruntime. (As arguably ::sum_weighted_vruntime would be a bit of a mouthful.)
Understanding the scheduler is hard enough already, without extra layers of obfuscated naming. ;-)
Also rename related helper functions:
sum_vruntime_add() => sum_w_vruntime_add()
sum_vruntime_sub() => sum_w_vruntime_sub()
sum_vruntime_update() => sum_w_vruntime_update()
With the notable exception of cfs_avg_vruntime(), which was named accurately.
--- kernel/sched/fair.c | 26 +++++++++++++------------- kernel/sched/sched.h | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-)
kernel/sched/fair.c +13 -13
@@ -607,7 +607,7 @@ static inline s64 entity_key(struct cfs_rq *cfs_rq, struct sched_entity *se)* Which we track using: * * v0 := cfs_rq->zero_vruntime -* \Sum (v_i - v0) * w_i := cfs_rq->avg_vruntime +* \Sum (v_i - v0) * w_i := cfs_rq->sum_w_vruntime * \Sum w_i := cfs_rq->sum_weight * * Since zero_vruntime closely tracks the per-task service, these
@@ -619,32 +619,32 @@ static inline s64 entity_key(struct cfs_rq *cfs_rq, struct sched_entity *se)* As measured, the max (key * weight) value was ~44 bits for a kernel build. */ static void -avg_vruntime_add (struct cfs_rq *cfs_rq,struct sched_entity *se) +sum_w_vruntime_add (struct cfs_rq *cfs_rq,struct sched_entity *se) {unsigned long weight =scale_load_down (se->load.weight);s64 key =entity_key (cfs_rq, se); - cfs_rq->avg_vruntime += key * weight; + cfs_rq->sum_w_vruntime += key * weight; cfs_rq->sum_weight += weight; }static void -avg_vruntime_sub (struct cfs_rq *cfs_rq,struct sched_entity *se) +sum_w_vruntime_sub (struct cfs_rq *cfs_rq,struct sched_entity *se) {unsigned long weight =scale_load_down (se->load.weight);s64 key =entity_key (cfs_rq, se); - cfs_rq->avg_vruntime -= key * weight; + cfs_rq->sum_w_vruntime -= key * weight; cfs_rq->sum_weight -= weight; }static inline -void avg_vruntime_update (struct cfs_rq *cfs_rq,s64 delta) +void sum_w_vruntime_update (struct cfs_rq *cfs_rq,s64 delta) {/* -* v' = v + d ==> avg_vruntime' = avg_runtime - d*sum_weight +* v' = v + d ==> sum_w_vruntime' = sum_runtime - d*sum_weight */ - cfs_rq->avg_vruntime -= cfs_rq->sum_weight * delta; + cfs_rq->sum_w_vruntime -= cfs_rq->sum_weight * delta; }/*
@@ -654,7 +654,7 @@ void avg_vruntime_update(struct cfs_rq *cfs_rq, s64 delta)u64 avg_vruntime (struct cfs_rq *cfs_rq) {struct sched_entity *curr = cfs_rq->curr; -s64 avg = cfs_rq->avg_vruntime; +s64 avg = cfs_rq->sum_w_vruntime;long load = cfs_rq->sum_weight;if (curr && curr->on_rq) {
@@ -722,7 +722,7 @@ static void update_entity_lag(struct cfs_rq *cfs_rq, struct sched_entity *se)static int vruntime_eligible (struct cfs_rq *cfs_rq,u64 vruntime) {struct sched_entity *curr = cfs_rq->curr; -s64 avg = cfs_rq->avg_vruntime; +s64 avg = cfs_rq->sum_w_vruntime;long load = cfs_rq->sum_weight;if (curr && curr->on_rq) {
@@ -745,7 +745,7 @@ static void update_zero_vruntime(struct cfs_rq *cfs_rq)u64 vruntime =avg_vruntime (cfs_rq);s64 delta = (s64)(vruntime - cfs_rq->zero_vruntime); -avg_vruntime_update (cfs_rq, delta); +sum_w_vruntime_update (cfs_rq, delta); cfs_rq->zero_vruntime = vruntime; }
@@ -819,7 +819,7 @@ RB_DECLARE_CALLBACKS(static, min_vruntime_cb, struct sched_entity,*/ static void __enqueue_entity (struct cfs_rq *cfs_rq,struct sched_entity *se) { -avg_vruntime_add (cfs_rq, se); +sum_w_vruntime_add (cfs_rq, se);update_zero_vruntime (cfs_rq); se->min_vruntime = se->vruntime; se->min_slice = se->slice;
@@ -831,7 +831,7 @@ static void __dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se) {rb_erase_augmented_cached (&se->run_node, &cfs_rq->tasks_timeline, &min_vruntime_cb); -avg_vruntime_sub (cfs_rq, se); +sum_w_vruntime_sub (cfs_rq, se);update_zero_vruntime (cfs_rq); }
kernel/sched/sched.h +1 -1
@@ -678,7 +678,7 @@ struct cfs_rq {unsigned int h_nr_runnable;/* SCHED_{NORMAL,BATCH,IDLE} */ unsigned int h_nr_idle;/* SCHED_IDLE */ -s64 avg_vruntime; +s64 sum_w_vruntime;u64 sum_weight;u64 zero_vruntime;
[tip: sched/core] sched/fair: Rename cfs_rq::avg_vruntime to ::sum_w_vruntime, and helper functions
In reply to Ingo MolnarThe following commit has been merged into the sched/core branch of tip:
The following commit has been merged into the sched/core branch of tip:
Commit-ID: dcbc9d3f0e594223275a18f7016001889ad35eff Gitweb: https://git.kernel.org/tip/dcbc9d3f0e594223275a18f7016001889ad35eff Author: Ingo Molnar <[email protected]> AuthorDate: Tue, 02 Dec 2025 16:09:23 +01:00 Committer: Ingo Molnar <[email protected]> CommitterDate: Mon, 15 Dec 2025 07:52:44 +01:00
sched/fair: Rename cfs_rq::avg_vruntime to ::sum_w_vruntime, and helper functions
The ::avg_vruntime field is a misnomer: it says it's an 'average vruntime', but in reality it's the momentary sum of the weighted vruntimes of all queued tasks, which is at least a division away from being an average.
This is clear from comments about the math of fair scheduling:
* \Sum (v_i - v0) * w_i := cfs_rq->avg_vruntime
This confusion is increased by the cfs_avg_vruntime() function, which does perform the division and returns a true average.
The sum of all weighted vruntimes should be named thusly, so rename the field to ::sum_w_vruntime. (As arguably ::sum_weighted_vruntime would be a bit of a mouthful.)
Understanding the scheduler is hard enough already, without extra layers of obfuscated naming. ;-)
Also rename related helper functions:
sum_vruntime_add() => sum_w_vruntime_add()
sum_vruntime_sub() => sum_w_vruntime_sub()
sum_vruntime_update() => sum_w_vruntime_update()
With the notable exception of cfs_avg_vruntime(), which was named accurately.
--- kernel/sched/fair.c | 26 +++++++++++++------------- kernel/sched/sched.h | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-)
kernel/sched/fair.c +13 -13
@@ -607,7 +607,7 @@ static inline s64 entity_key(struct cfs_rq *cfs_rq, struct sched_entity *se)* Which we track using: * * v0 := cfs_rq->zero_vruntime -* \Sum (v_i - v0) * w_i := cfs_rq->avg_vruntime +* \Sum (v_i - v0) * w_i := cfs_rq->sum_w_vruntime * \Sum w_i := cfs_rq->sum_weight * * Since zero_vruntime closely tracks the per-task service, these
@@ -619,32 +619,32 @@ static inline s64 entity_key(struct cfs_rq *cfs_rq, struct sched_entity *se)* As measured, the max (key * weight) value was ~44 bits for a kernel build. */ static void -avg_vruntime_add (struct cfs_rq *cfs_rq,struct sched_entity *se) +sum_w_vruntime_add (struct cfs_rq *cfs_rq,struct sched_entity *se) {unsigned long weight =scale_load_down (se->load.weight);s64 key =entity_key (cfs_rq, se); - cfs_rq->avg_vruntime += key * weight; + cfs_rq->sum_w_vruntime += key * weight; cfs_rq->sum_weight += weight; }static void -avg_vruntime_sub (struct cfs_rq *cfs_rq,struct sched_entity *se) +sum_w_vruntime_sub (struct cfs_rq *cfs_rq,struct sched_entity *se) {unsigned long weight =scale_load_down (se->load.weight);s64 key =entity_key (cfs_rq, se); - cfs_rq->avg_vruntime -= key * weight; + cfs_rq->sum_w_vruntime -= key * weight; cfs_rq->sum_weight -= weight; }static inline -void avg_vruntime_update (struct cfs_rq *cfs_rq,s64 delta) +void sum_w_vruntime_update (struct cfs_rq *cfs_rq,s64 delta) {/* -* v' = v + d ==> avg_vruntime' = avg_runtime - d*sum_weight +* v' = v + d ==> sum_w_vruntime' = sum_runtime - d*sum_weight */ - cfs_rq->avg_vruntime -= cfs_rq->sum_weight * delta; + cfs_rq->sum_w_vruntime -= cfs_rq->sum_weight * delta; }/*
@@ -654,7 +654,7 @@ void avg_vruntime_update(struct cfs_rq *cfs_rq, s64 delta)u64 avg_vruntime (struct cfs_rq *cfs_rq) {struct sched_entity *curr = cfs_rq->curr; -s64 avg = cfs_rq->avg_vruntime; +s64 avg = cfs_rq->sum_w_vruntime;long load = cfs_rq->sum_weight;if (curr && curr->on_rq) {
@@ -722,7 +722,7 @@ static void update_entity_lag(struct cfs_rq *cfs_rq, struct sched_entity *se)static int vruntime_eligible (struct cfs_rq *cfs_rq,u64 vruntime) {struct sched_entity *curr = cfs_rq->curr; -s64 avg = cfs_rq->avg_vruntime; +s64 avg = cfs_rq->sum_w_vruntime;long load = cfs_rq->sum_weight;if (curr && curr->on_rq) {
@@ -745,7 +745,7 @@ static void update_zero_vruntime(struct cfs_rq *cfs_rq)u64 vruntime =avg_vruntime (cfs_rq);s64 delta = (s64)(vruntime - cfs_rq->zero_vruntime); -avg_vruntime_update (cfs_rq, delta); +sum_w_vruntime_update (cfs_rq, delta); cfs_rq->zero_vruntime = vruntime; }
@@ -819,7 +819,7 @@ RB_DECLARE_CALLBACKS(static, min_vruntime_cb, struct sched_entity,*/ static void __enqueue_entity (struct cfs_rq *cfs_rq,struct sched_entity *se) { -avg_vruntime_add (cfs_rq, se); +sum_w_vruntime_add (cfs_rq, se);update_zero_vruntime (cfs_rq); se->min_vruntime = se->vruntime; se->min_slice = se->slice;
@@ -831,7 +831,7 @@ static void __dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se) {rb_erase_augmented_cached (&se->run_node, &cfs_rq->tasks_timeline, &min_vruntime_cb); -avg_vruntime_sub (cfs_rq, se); +sum_w_vruntime_sub (cfs_rq, se);update_zero_vruntime (cfs_rq); }
kernel/sched/sched.h +1 -1
@@ -678,7 +678,7 @@ struct cfs_rq {unsigned int h_nr_runnable;/* SCHED_{NORMAL,BATCH,IDLE} */ unsigned int h_nr_idle;/* SCHED_IDLE */ -s64 avg_vruntime; +s64 sum_w_vruntime;u64 sum_weight;u64 zero_vruntime;