* [PATCH v2 0/2] sched/fair: optimize and simplify rq leaf_cfs_rq_list
@ 2022-05-26 7:13 Chengming Zhou
2022-05-26 7:13 ` [PATCH v2 1/2] sched/fair: fix propagate during synchronous attach/detach Chengming Zhou
2022-05-26 7:13 ` [PATCH v2 2/2] sched/fair: optimize and simplify rq leaf_cfs_rq_list Chengming Zhou
0 siblings, 2 replies; 7+ messages in thread
From: Chengming Zhou @ 2022-05-26 7:13 UTC (permalink / raw)
To: mingo, peterz, juri.lelli, vincent.guittot, dietmar.eggemann,
rostedt, bsegall, mgorman, bristot, vschneid, odin
Cc: linux-kernel, duanxiongchun, songmuchun, Chengming Zhou
Hi,
This v2 is based on [1], which try to not put cfs_rqs in throttled_hierarchy
on the rq leaf_cfs_rq_list, simplify the leaf_cfs_rq_list maintenance and
optimize the periodic load decay.
Vincent suggested moving throttled_hierarchy() outside list_add_leaf_cfs_rq()
because the task will not be added in this case which is quite misleading.
When do that moving in propagate_entity_cfs_rq(), I found it has problem
with propagation upwards. So add the fix in the first patch to be easier
to backport, please see the details in its commit message.
[1] https://lore.kernel.org/all/20220427160544.40309-1-zhouchengming@bytedance.com/
Chengming Zhou (2):
sched/fair: fix propagate during synchronous attach/detach
sched/fair: optimize and simplify rq leaf_cfs_rq_list
kernel/sched/fair.c | 83 +++++++++++----------------------------------
1 file changed, 20 insertions(+), 63 deletions(-)
--
2.36.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2 1/2] sched/fair: fix propagate during synchronous attach/detach
2022-05-26 7:13 [PATCH v2 0/2] sched/fair: optimize and simplify rq leaf_cfs_rq_list Chengming Zhou
@ 2022-05-26 7:13 ` Chengming Zhou
2022-05-26 7:13 ` [PATCH v2 2/2] sched/fair: optimize and simplify rq leaf_cfs_rq_list Chengming Zhou
1 sibling, 0 replies; 7+ messages in thread
From: Chengming Zhou @ 2022-05-26 7:13 UTC (permalink / raw)
To: mingo, peterz, juri.lelli, vincent.guittot, dietmar.eggemann,
rostedt, bsegall, mgorman, bristot, vschneid, odin
Cc: linux-kernel, duanxiongchun, songmuchun, Chengming Zhou
When a task moves from/to a cfs_rq, we first detach/attach the load_avg
of se from/to that cfs_rq, then propagate the changes across the tg tree
to make it visible to the root, which did in update_load_avg().
But the current code will break when encountering a on_list cfs_rq,
can't propagate up to the root cfs_rq, that also mismatch with the
comment of propagate_entity_cfs_rq(), which says "Propagate the changes
of the sched_entity across the tg tree to make it visible to the root".
The second problem is that it won't update_load_avg() for throttled
cfs_rq, cause the load changes can't be propagated upwards.
A
|
B --> throttled cfs_rq
/
C
The prop_runnable_sum of C won't be propagated to B, so won't be
propagated to A.
Fixes: 0258bdfaff5b ("sched/fair: Fix unfairness caused by missing load decay")
Signed-off-by: Chengming Zhou <zhouchengming@bytedance.com>
---
kernel/sched/fair.c | 10 ++--------
1 file changed, 2 insertions(+), 8 deletions(-)
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 523e548c8fdd..5276d05692e0 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -11303,14 +11303,8 @@ static void propagate_entity_cfs_rq(struct sched_entity *se)
for_each_sched_entity(se) {
cfs_rq = cfs_rq_of(se);
- if (!cfs_rq_throttled(cfs_rq)){
- update_load_avg(cfs_rq, se, UPDATE_TG);
- list_add_leaf_cfs_rq(cfs_rq);
- continue;
- }
-
- if (list_add_leaf_cfs_rq(cfs_rq))
- break;
+ update_load_avg(cfs_rq, se, UPDATE_TG);
+ list_add_leaf_cfs_rq(cfs_rq);
}
}
#else
--
2.36.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v2 2/2] sched/fair: optimize and simplify rq leaf_cfs_rq_list
2022-05-26 7:13 [PATCH v2 0/2] sched/fair: optimize and simplify rq leaf_cfs_rq_list Chengming Zhou
2022-05-26 7:13 ` [PATCH v2 1/2] sched/fair: fix propagate during synchronous attach/detach Chengming Zhou
@ 2022-05-26 7:13 ` Chengming Zhou
2022-05-26 8:53 ` kernel test robot
2022-05-26 10:46 ` kernel test robot
1 sibling, 2 replies; 7+ messages in thread
From: Chengming Zhou @ 2022-05-26 7:13 UTC (permalink / raw)
To: mingo, peterz, juri.lelli, vincent.guittot, dietmar.eggemann,
rostedt, bsegall, mgorman, bristot, vschneid, odin
Cc: linux-kernel, duanxiongchun, songmuchun, Chengming Zhou
We notice the rq leaf_cfs_rq_list has two problems when do bugfix
backports and some test profiling.
1. cfs_rqs under throttled subtree could be added to the list, and
make their fully decayed ancestors on the list, even though not needed.
2. #1 also make the leaf_cfs_rq_list management complex and error prone,
this is the list of related bugfix so far:
commit 31bc6aeaab1d ("sched/fair: Optimize update_blocked_averages()")
commit fe61468b2cbc ("sched/fair: Fix enqueue_task_fair warning")
commit b34cb07dde7c ("sched/fair: Fix enqueue_task_fair() warning some more")
commit 39f23ce07b93 ("sched/fair: Fix unthrottle_cfs_rq() for leaf_cfs_rq list")
commit 0258bdfaff5b ("sched/fair: Fix unfairness caused by missing load decay")
commit a7b359fc6a37 ("sched/fair: Correctly insert cfs_rq's to list on unthrottle")
commit fdaba61ef8a2 ("sched/fair: Ensure that the CFS parent is added after unthrottling")
commit 2630cde26711 ("sched/fair: Add ancestors of unthrottled undecayed cfs_rq")
commit 31bc6aeaab1d ("sched/fair: Optimize update_blocked_averages()")
delete every cfs_rq under throttled subtree from rq->leaf_cfs_rq_list,
and delete the throttled_hierarchy() test in update_blocked_averages(),
which optimized update_blocked_averages().
But those later bugfix add cfs_rqs under throttled subtree back to
rq->leaf_cfs_rq_list again, with their fully decayed ancestors, for
the integrity of rq->leaf_cfs_rq_list.
This patch takes another method, skip all cfs_rqs under throttled
hierarchy when list_add_leaf_cfs_rq(), to completely make cfs_rqs
under throttled subtree off the leaf_cfs_rq_list.
So we don't need to consider throttled related things in
enqueue_entity(), unthrottle_cfs_rq() and enqueue_task_fair(),
which simplify the code a lot. Also optimize update_blocked_averages()
since cfs_rqs under throttled hierarchy and their ancestors
won't be on the leaf_cfs_rq_list.
Signed-off-by: Chengming Zhou <zhouchengming@bytedance.com>
---
v2:
- move throttled_hierarchy() outside list_add_leaf_cfs_rq(),
suggested by Vincent.
---
kernel/sched/fair.c | 77 ++++++++++++---------------------------------
1 file changed, 20 insertions(+), 57 deletions(-)
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 5276d05692e0..7438c1865109 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -4374,16 +4374,11 @@ enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags)
__enqueue_entity(cfs_rq, se);
se->on_rq = 1;
- /*
- * When bandwidth control is enabled, cfs might have been removed
- * because of a parent been throttled but cfs->nr_running > 1. Try to
- * add it unconditionally.
- */
- if (cfs_rq->nr_running == 1 || cfs_bandwidth_used())
- list_add_leaf_cfs_rq(cfs_rq);
-
- if (cfs_rq->nr_running == 1)
+ if (cfs_rq->nr_running == 1) {
check_enqueue_throttle(cfs_rq);
+ if (!throttled_hierarchy(cfs_rq))
+ list_add_leaf_cfs_rq(cfs_rq);
+ }
}
static void __clear_buddies_last(struct sched_entity *se)
@@ -4998,11 +4993,18 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq)
/* update hierarchical throttle state */
walk_tg_tree_from(cfs_rq->tg, tg_nop, tg_unthrottle_up, (void *)rq);
- /* Nothing to run but something to decay (on_list)? Complete the branch */
if (!cfs_rq->load.weight) {
- if (cfs_rq->on_list)
- goto unthrottle_throttle;
- return;
+ if (!cfs_rq->on_list)
+ return;
+ /*
+ * Nothing to run but something to decay (on_list)?
+ * Complete the branch.
+ */
+ for_each_sched_entity(se) {
+ if (list_add_leaf_cfs_rq(cfs_rq_of(se)))
+ break;
+ }
+ goto unthrottle_throttle;
}
task_delta = cfs_rq->h_nr_running;
@@ -5040,31 +5042,12 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq)
/* end evaluation on encountering a throttled cfs_rq */
if (cfs_rq_throttled(qcfs_rq))
goto unthrottle_throttle;
-
- /*
- * One parent has been throttled and cfs_rq removed from the
- * list. Add it back to not break the leaf list.
- */
- if (throttled_hierarchy(qcfs_rq))
- list_add_leaf_cfs_rq(qcfs_rq);
}
/* At this point se is NULL and we are at root level*/
add_nr_running(rq, task_delta);
unthrottle_throttle:
- /*
- * The cfs_rq_throttled() breaks in the above iteration can result in
- * incomplete leaf list maintenance, resulting in triggering the
- * assertion below.
- */
- for_each_sched_entity(se) {
- struct cfs_rq *qcfs_rq = cfs_rq_of(se);
-
- if (list_add_leaf_cfs_rq(qcfs_rq))
- break;
- }
-
assert_list_leaf_cfs_rq(rq);
/* Determine whether we need to wake up potentially idle CPU: */
@@ -5719,13 +5702,6 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags)
/* end evaluation on encountering a throttled cfs_rq */
if (cfs_rq_throttled(cfs_rq))
goto enqueue_throttle;
-
- /*
- * One parent has been throttled and cfs_rq removed from the
- * list. Add it back to not break the leaf list.
- */
- if (throttled_hierarchy(cfs_rq))
- list_add_leaf_cfs_rq(cfs_rq);
}
/* At this point se is NULL and we are at root level*/
@@ -5749,21 +5725,6 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags)
update_overutilized_status(rq);
enqueue_throttle:
- if (cfs_bandwidth_used()) {
- /*
- * When bandwidth control is enabled; the cfs_rq_throttled()
- * breaks in the above iteration can result in incomplete
- * leaf list maintenance, resulting in triggering the assertion
- * below.
- */
- for_each_sched_entity(se) {
- cfs_rq = cfs_rq_of(se);
-
- if (list_add_leaf_cfs_rq(cfs_rq))
- break;
- }
- }
-
assert_list_leaf_cfs_rq(rq);
hrtick_update(rq);
@@ -11293,9 +11254,10 @@ static inline bool vruntime_normalized(struct task_struct *p)
*/
static void propagate_entity_cfs_rq(struct sched_entity *se)
{
- struct cfs_rq *cfs_rq;
+ struct cfs_rq *cfs_rq = cfs_rq_of(se);
- list_add_leaf_cfs_rq(cfs_rq_of(se));
+ if (!throttled_hierarchy(cfs_rq))
+ list_add_leaf_cfs_rq(cfs_rq);
/* Start to propagate at parent */
se = se->parent;
@@ -11304,7 +11266,8 @@ static void propagate_entity_cfs_rq(struct sched_entity *se)
cfs_rq = cfs_rq_of(se);
update_load_avg(cfs_rq, se, UPDATE_TG);
- list_add_leaf_cfs_rq(cfs_rq);
+ if (!throttled_hierarchy(cfs_rq))
+ list_add_leaf_cfs_rq(cfs_rq);
}
}
#else
--
2.36.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v2 2/2] sched/fair: optimize and simplify rq leaf_cfs_rq_list
2022-05-26 7:13 ` [PATCH v2 2/2] sched/fair: optimize and simplify rq leaf_cfs_rq_list Chengming Zhou
@ 2022-05-26 8:53 ` kernel test robot
2022-05-26 10:25 ` Chengming Zhou
2022-05-26 10:46 ` kernel test robot
1 sibling, 1 reply; 7+ messages in thread
From: kernel test robot @ 2022-05-26 8:53 UTC (permalink / raw)
To: Chengming Zhou, mingo, peterz, juri.lelli, vincent.guittot,
dietmar.eggemann, rostedt, bsegall, mgorman, bristot, vschneid,
odin
Cc: kbuild-all, linux-kernel, duanxiongchun, songmuchun, Chengming Zhou
Hi Chengming,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on tip/sched/core]
[also build test ERROR on tip/master linus/master v5.18 next-20220525]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/intel-lab-lkp/linux/commits/Chengming-Zhou/sched-fair-optimize-and-simplify-rq-leaf_cfs_rq_list/20220526-151850
base: https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 991d8d8142cad94f9c5c05db25e67fa83d6f772a
config: powerpc-allnoconfig (https://download.01.org/0day-ci/archive/20220526/202205261617.YUT1ixQ8-lkp@intel.com/config)
compiler: powerpc-linux-gcc (GCC) 11.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/cb2b1810aeb3f8f290a932f3e625ab9df1110054
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Chengming-Zhou/sched-fair-optimize-and-simplify-rq-leaf_cfs_rq_list/20220526-151850
git checkout cb2b1810aeb3f8f290a932f3e625ab9df1110054
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.3.0 make.cross W=1 O=build_dir ARCH=powerpc SHELL=/bin/bash kernel/sched/
If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
kernel/sched/fair.c:645:5: warning: no previous prototype for 'sched_update_scaling' [-Wmissing-prototypes]
645 | int sched_update_scaling(void)
| ^~~~~~~~~~~~~~~~~~~~
kernel/sched/fair.c: In function 'enqueue_entity':
>> kernel/sched/fair.c:4343:22: error: implicit declaration of function 'throttled_hierarchy' [-Werror=implicit-function-declaration]
4343 | if (!throttled_hierarchy(cfs_rq))
| ^~~~~~~~~~~~~~~~~~~
kernel/sched/fair.c: At top level:
>> kernel/sched/fair.c:5484:19: error: static declaration of 'throttled_hierarchy' follows non-static declaration
5484 | static inline int throttled_hierarchy(struct cfs_rq *cfs_rq)
| ^~~~~~~~~~~~~~~~~~~
kernel/sched/fair.c:4343:22: note: previous implicit declaration of 'throttled_hierarchy' with type 'int()'
4343 | if (!throttled_hierarchy(cfs_rq))
| ^~~~~~~~~~~~~~~~~~~
kernel/sched/fair.c:5495:6: warning: no previous prototype for 'init_cfs_bandwidth' [-Wmissing-prototypes]
5495 | void init_cfs_bandwidth(struct cfs_bandwidth *cfs_b) {}
| ^~~~~~~~~~~~~~~~~~
kernel/sched/fair.c:11654:6: warning: no previous prototype for 'free_fair_sched_group' [-Wmissing-prototypes]
11654 | void free_fair_sched_group(struct task_group *tg) { }
| ^~~~~~~~~~~~~~~~~~~~~
kernel/sched/fair.c:11656:5: warning: no previous prototype for 'alloc_fair_sched_group' [-Wmissing-prototypes]
11656 | int alloc_fair_sched_group(struct task_group *tg, struct task_group *parent)
| ^~~~~~~~~~~~~~~~~~~~~~
kernel/sched/fair.c:11661:6: warning: no previous prototype for 'online_fair_sched_group' [-Wmissing-prototypes]
11661 | void online_fair_sched_group(struct task_group *tg) { }
| ^~~~~~~~~~~~~~~~~~~~~~~
kernel/sched/fair.c:11663:6: warning: no previous prototype for 'unregister_fair_sched_group' [-Wmissing-prototypes]
11663 | void unregister_fair_sched_group(struct task_group *tg) { }
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1: some warnings being treated as errors
vim +/throttled_hierarchy +4343 kernel/sched/fair.c
4263
4264 /*
4265 * MIGRATION
4266 *
4267 * dequeue
4268 * update_curr()
4269 * update_min_vruntime()
4270 * vruntime -= min_vruntime
4271 *
4272 * enqueue
4273 * update_curr()
4274 * update_min_vruntime()
4275 * vruntime += min_vruntime
4276 *
4277 * this way the vruntime transition between RQs is done when both
4278 * min_vruntime are up-to-date.
4279 *
4280 * WAKEUP (remote)
4281 *
4282 * ->migrate_task_rq_fair() (p->state == TASK_WAKING)
4283 * vruntime -= min_vruntime
4284 *
4285 * enqueue
4286 * update_curr()
4287 * update_min_vruntime()
4288 * vruntime += min_vruntime
4289 *
4290 * this way we don't have the most up-to-date min_vruntime on the originating
4291 * CPU and an up-to-date min_vruntime on the destination CPU.
4292 */
4293
4294 static void
4295 enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags)
4296 {
4297 bool renorm = !(flags & ENQUEUE_WAKEUP) || (flags & ENQUEUE_MIGRATED);
4298 bool curr = cfs_rq->curr == se;
4299
4300 /*
4301 * If we're the current task, we must renormalise before calling
4302 * update_curr().
4303 */
4304 if (renorm && curr)
4305 se->vruntime += cfs_rq->min_vruntime;
4306
4307 update_curr(cfs_rq);
4308
4309 /*
4310 * Otherwise, renormalise after, such that we're placed at the current
4311 * moment in time, instead of some random moment in the past. Being
4312 * placed in the past could significantly boost this task to the
4313 * fairness detriment of existing tasks.
4314 */
4315 if (renorm && !curr)
4316 se->vruntime += cfs_rq->min_vruntime;
4317
4318 /*
4319 * When enqueuing a sched_entity, we must:
4320 * - Update loads to have both entity and cfs_rq synced with now.
4321 * - Add its load to cfs_rq->runnable_avg
4322 * - For group_entity, update its weight to reflect the new share of
4323 * its group cfs_rq
4324 * - Add its new weight to cfs_rq->load.weight
4325 */
4326 update_load_avg(cfs_rq, se, UPDATE_TG | DO_ATTACH);
4327 se_update_runnable(se);
4328 update_cfs_group(se);
4329 account_entity_enqueue(cfs_rq, se);
4330
4331 if (flags & ENQUEUE_WAKEUP)
4332 place_entity(cfs_rq, se, 0);
4333
4334 check_schedstat_required();
4335 update_stats_enqueue_fair(cfs_rq, se, flags);
4336 check_spread(cfs_rq, se);
4337 if (!curr)
4338 __enqueue_entity(cfs_rq, se);
4339 se->on_rq = 1;
4340
4341 if (cfs_rq->nr_running == 1) {
4342 check_enqueue_throttle(cfs_rq);
> 4343 if (!throttled_hierarchy(cfs_rq))
4344 list_add_leaf_cfs_rq(cfs_rq);
4345 }
4346 }
4347
--
0-DAY CI Kernel Test Service
https://01.org/lkp
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [External] Re: [PATCH v2 2/2] sched/fair: optimize and simplify rq leaf_cfs_rq_list
2022-05-26 8:53 ` kernel test robot
@ 2022-05-26 10:25 ` Chengming Zhou
0 siblings, 0 replies; 7+ messages in thread
From: Chengming Zhou @ 2022-05-26 10:25 UTC (permalink / raw)
To: kernel test robot, mingo, peterz, juri.lelli, vincent.guittot,
dietmar.eggemann, rostedt, bsegall, mgorman, bristot, vschneid,
odin
Cc: kbuild-all, linux-kernel, duanxiongchun, songmuchun
On 2022/5/26 16:53, kernel test robot wrote:
> Hi Chengming,
>
> Thank you for the patch! Yet something to improve:
>
> [auto build test ERROR on tip/sched/core]
> [also build test ERROR on tip/master linus/master v5.18 next-20220525]
> [If your patch is applied to the wrong git tree, kindly drop us a note.
> And when submitting patch, we suggest to use '--base' as documented in
> https://git-scm.com/docs/git-format-patch]
>
> url: https://github.com/intel-lab-lkp/linux/commits/Chengming-Zhou/sched-fair-optimize-and-simplify-rq-leaf_cfs_rq_list/20220526-151850
> base: https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 991d8d8142cad94f9c5c05db25e67fa83d6f772a
> config: powerpc-allnoconfig (https://download.01.org/0day-ci/archive/20220526/202205261617.YUT1ixQ8-lkp@intel.com/config)
> compiler: powerpc-linux-gcc (GCC) 11.3.0
> reproduce (this is a W=1 build):
> wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
> chmod +x ~/bin/make.cross
> # https://github.com/intel-lab-lkp/linux/commit/cb2b1810aeb3f8f290a932f3e625ab9df1110054
> git remote add linux-review https://github.com/intel-lab-lkp/linux
> git fetch --no-tags linux-review Chengming-Zhou/sched-fair-optimize-and-simplify-rq-leaf_cfs_rq_list/20220526-151850
> git checkout cb2b1810aeb3f8f290a932f3e625ab9df1110054
> # save the config file
> mkdir build_dir && cp config build_dir/.config
> COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.3.0 make.cross W=1 O=build_dir ARCH=powerpc SHELL=/bin/bash kernel/sched/
>
> If you fix the issue, kindly add following tag where applicable
> Reported-by: kernel test robot <lkp@intel.com>
Thanks, will fix !CONFIG_FAIR_GROUP_SCHED build next version.
>
> All errors (new ones prefixed by >>):
>
> kernel/sched/fair.c:645:5: warning: no previous prototype for 'sched_update_scaling' [-Wmissing-prototypes]
> 645 | int sched_update_scaling(void)
> | ^~~~~~~~~~~~~~~~~~~~
> kernel/sched/fair.c: In function 'enqueue_entity':
>>> kernel/sched/fair.c:4343:22: error: implicit declaration of function 'throttled_hierarchy' [-Werror=implicit-function-declaration]
> 4343 | if (!throttled_hierarchy(cfs_rq))
> | ^~~~~~~~~~~~~~~~~~~
> kernel/sched/fair.c: At top level:
>>> kernel/sched/fair.c:5484:19: error: static declaration of 'throttled_hierarchy' follows non-static declaration
> 5484 | static inline int throttled_hierarchy(struct cfs_rq *cfs_rq)
> | ^~~~~~~~~~~~~~~~~~~
> kernel/sched/fair.c:4343:22: note: previous implicit declaration of 'throttled_hierarchy' with type 'int()'
> 4343 | if (!throttled_hierarchy(cfs_rq))
> | ^~~~~~~~~~~~~~~~~~~
> kernel/sched/fair.c:5495:6: warning: no previous prototype for 'init_cfs_bandwidth' [-Wmissing-prototypes]
> 5495 | void init_cfs_bandwidth(struct cfs_bandwidth *cfs_b) {}
> | ^~~~~~~~~~~~~~~~~~
> kernel/sched/fair.c:11654:6: warning: no previous prototype for 'free_fair_sched_group' [-Wmissing-prototypes]
> 11654 | void free_fair_sched_group(struct task_group *tg) { }
> | ^~~~~~~~~~~~~~~~~~~~~
> kernel/sched/fair.c:11656:5: warning: no previous prototype for 'alloc_fair_sched_group' [-Wmissing-prototypes]
> 11656 | int alloc_fair_sched_group(struct task_group *tg, struct task_group *parent)
> | ^~~~~~~~~~~~~~~~~~~~~~
> kernel/sched/fair.c:11661:6: warning: no previous prototype for 'online_fair_sched_group' [-Wmissing-prototypes]
> 11661 | void online_fair_sched_group(struct task_group *tg) { }
> | ^~~~~~~~~~~~~~~~~~~~~~~
> kernel/sched/fair.c:11663:6: warning: no previous prototype for 'unregister_fair_sched_group' [-Wmissing-prototypes]
> 11663 | void unregister_fair_sched_group(struct task_group *tg) { }
> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~
> cc1: some warnings being treated as errors
>
>
> vim +/throttled_hierarchy +4343 kernel/sched/fair.c
>
> 4263
> 4264 /*
> 4265 * MIGRATION
> 4266 *
> 4267 * dequeue
> 4268 * update_curr()
> 4269 * update_min_vruntime()
> 4270 * vruntime -= min_vruntime
> 4271 *
> 4272 * enqueue
> 4273 * update_curr()
> 4274 * update_min_vruntime()
> 4275 * vruntime += min_vruntime
> 4276 *
> 4277 * this way the vruntime transition between RQs is done when both
> 4278 * min_vruntime are up-to-date.
> 4279 *
> 4280 * WAKEUP (remote)
> 4281 *
> 4282 * ->migrate_task_rq_fair() (p->state == TASK_WAKING)
> 4283 * vruntime -= min_vruntime
> 4284 *
> 4285 * enqueue
> 4286 * update_curr()
> 4287 * update_min_vruntime()
> 4288 * vruntime += min_vruntime
> 4289 *
> 4290 * this way we don't have the most up-to-date min_vruntime on the originating
> 4291 * CPU and an up-to-date min_vruntime on the destination CPU.
> 4292 */
> 4293
> 4294 static void
> 4295 enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags)
> 4296 {
> 4297 bool renorm = !(flags & ENQUEUE_WAKEUP) || (flags & ENQUEUE_MIGRATED);
> 4298 bool curr = cfs_rq->curr == se;
> 4299
> 4300 /*
> 4301 * If we're the current task, we must renormalise before calling
> 4302 * update_curr().
> 4303 */
> 4304 if (renorm && curr)
> 4305 se->vruntime += cfs_rq->min_vruntime;
> 4306
> 4307 update_curr(cfs_rq);
> 4308
> 4309 /*
> 4310 * Otherwise, renormalise after, such that we're placed at the current
> 4311 * moment in time, instead of some random moment in the past. Being
> 4312 * placed in the past could significantly boost this task to the
> 4313 * fairness detriment of existing tasks.
> 4314 */
> 4315 if (renorm && !curr)
> 4316 se->vruntime += cfs_rq->min_vruntime;
> 4317
> 4318 /*
> 4319 * When enqueuing a sched_entity, we must:
> 4320 * - Update loads to have both entity and cfs_rq synced with now.
> 4321 * - Add its load to cfs_rq->runnable_avg
> 4322 * - For group_entity, update its weight to reflect the new share of
> 4323 * its group cfs_rq
> 4324 * - Add its new weight to cfs_rq->load.weight
> 4325 */
> 4326 update_load_avg(cfs_rq, se, UPDATE_TG | DO_ATTACH);
> 4327 se_update_runnable(se);
> 4328 update_cfs_group(se);
> 4329 account_entity_enqueue(cfs_rq, se);
> 4330
> 4331 if (flags & ENQUEUE_WAKEUP)
> 4332 place_entity(cfs_rq, se, 0);
> 4333
> 4334 check_schedstat_required();
> 4335 update_stats_enqueue_fair(cfs_rq, se, flags);
> 4336 check_spread(cfs_rq, se);
> 4337 if (!curr)
> 4338 __enqueue_entity(cfs_rq, se);
> 4339 se->on_rq = 1;
> 4340
> 4341 if (cfs_rq->nr_running == 1) {
> 4342 check_enqueue_throttle(cfs_rq);
>> 4343 if (!throttled_hierarchy(cfs_rq))
> 4344 list_add_leaf_cfs_rq(cfs_rq);
> 4345 }
> 4346 }
> 4347
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [External] Re: [PATCH v2 2/2] sched/fair: optimize and simplify rq leaf_cfs_rq_list
@ 2022-05-26 10:25 ` Chengming Zhou
0 siblings, 0 replies; 7+ messages in thread
From: Chengming Zhou @ 2022-05-26 10:25 UTC (permalink / raw)
To: kbuild-all
[-- Attachment #1: Type: text/plain, Size: 7215 bytes --]
On 2022/5/26 16:53, kernel test robot wrote:
> Hi Chengming,
>
> Thank you for the patch! Yet something to improve:
>
> [auto build test ERROR on tip/sched/core]
> [also build test ERROR on tip/master linus/master v5.18 next-20220525]
> [If your patch is applied to the wrong git tree, kindly drop us a note.
> And when submitting patch, we suggest to use '--base' as documented in
> https://git-scm.com/docs/git-format-patch]
>
> url: https://github.com/intel-lab-lkp/linux/commits/Chengming-Zhou/sched-fair-optimize-and-simplify-rq-leaf_cfs_rq_list/20220526-151850
> base: https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 991d8d8142cad94f9c5c05db25e67fa83d6f772a
> config: powerpc-allnoconfig (https://download.01.org/0day-ci/archive/20220526/202205261617.YUT1ixQ8-lkp(a)intel.com/config)
> compiler: powerpc-linux-gcc (GCC) 11.3.0
> reproduce (this is a W=1 build):
> wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
> chmod +x ~/bin/make.cross
> # https://github.com/intel-lab-lkp/linux/commit/cb2b1810aeb3f8f290a932f3e625ab9df1110054
> git remote add linux-review https://github.com/intel-lab-lkp/linux
> git fetch --no-tags linux-review Chengming-Zhou/sched-fair-optimize-and-simplify-rq-leaf_cfs_rq_list/20220526-151850
> git checkout cb2b1810aeb3f8f290a932f3e625ab9df1110054
> # save the config file
> mkdir build_dir && cp config build_dir/.config
> COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.3.0 make.cross W=1 O=build_dir ARCH=powerpc SHELL=/bin/bash kernel/sched/
>
> If you fix the issue, kindly add following tag where applicable
> Reported-by: kernel test robot <lkp@intel.com>
Thanks, will fix !CONFIG_FAIR_GROUP_SCHED build next version.
>
> All errors (new ones prefixed by >>):
>
> kernel/sched/fair.c:645:5: warning: no previous prototype for 'sched_update_scaling' [-Wmissing-prototypes]
> 645 | int sched_update_scaling(void)
> | ^~~~~~~~~~~~~~~~~~~~
> kernel/sched/fair.c: In function 'enqueue_entity':
>>> kernel/sched/fair.c:4343:22: error: implicit declaration of function 'throttled_hierarchy' [-Werror=implicit-function-declaration]
> 4343 | if (!throttled_hierarchy(cfs_rq))
> | ^~~~~~~~~~~~~~~~~~~
> kernel/sched/fair.c: At top level:
>>> kernel/sched/fair.c:5484:19: error: static declaration of 'throttled_hierarchy' follows non-static declaration
> 5484 | static inline int throttled_hierarchy(struct cfs_rq *cfs_rq)
> | ^~~~~~~~~~~~~~~~~~~
> kernel/sched/fair.c:4343:22: note: previous implicit declaration of 'throttled_hierarchy' with type 'int()'
> 4343 | if (!throttled_hierarchy(cfs_rq))
> | ^~~~~~~~~~~~~~~~~~~
> kernel/sched/fair.c:5495:6: warning: no previous prototype for 'init_cfs_bandwidth' [-Wmissing-prototypes]
> 5495 | void init_cfs_bandwidth(struct cfs_bandwidth *cfs_b) {}
> | ^~~~~~~~~~~~~~~~~~
> kernel/sched/fair.c:11654:6: warning: no previous prototype for 'free_fair_sched_group' [-Wmissing-prototypes]
> 11654 | void free_fair_sched_group(struct task_group *tg) { }
> | ^~~~~~~~~~~~~~~~~~~~~
> kernel/sched/fair.c:11656:5: warning: no previous prototype for 'alloc_fair_sched_group' [-Wmissing-prototypes]
> 11656 | int alloc_fair_sched_group(struct task_group *tg, struct task_group *parent)
> | ^~~~~~~~~~~~~~~~~~~~~~
> kernel/sched/fair.c:11661:6: warning: no previous prototype for 'online_fair_sched_group' [-Wmissing-prototypes]
> 11661 | void online_fair_sched_group(struct task_group *tg) { }
> | ^~~~~~~~~~~~~~~~~~~~~~~
> kernel/sched/fair.c:11663:6: warning: no previous prototype for 'unregister_fair_sched_group' [-Wmissing-prototypes]
> 11663 | void unregister_fair_sched_group(struct task_group *tg) { }
> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~
> cc1: some warnings being treated as errors
>
>
> vim +/throttled_hierarchy +4343 kernel/sched/fair.c
>
> 4263
> 4264 /*
> 4265 * MIGRATION
> 4266 *
> 4267 * dequeue
> 4268 * update_curr()
> 4269 * update_min_vruntime()
> 4270 * vruntime -= min_vruntime
> 4271 *
> 4272 * enqueue
> 4273 * update_curr()
> 4274 * update_min_vruntime()
> 4275 * vruntime += min_vruntime
> 4276 *
> 4277 * this way the vruntime transition between RQs is done when both
> 4278 * min_vruntime are up-to-date.
> 4279 *
> 4280 * WAKEUP (remote)
> 4281 *
> 4282 * ->migrate_task_rq_fair() (p->state == TASK_WAKING)
> 4283 * vruntime -= min_vruntime
> 4284 *
> 4285 * enqueue
> 4286 * update_curr()
> 4287 * update_min_vruntime()
> 4288 * vruntime += min_vruntime
> 4289 *
> 4290 * this way we don't have the most up-to-date min_vruntime on the originating
> 4291 * CPU and an up-to-date min_vruntime on the destination CPU.
> 4292 */
> 4293
> 4294 static void
> 4295 enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags)
> 4296 {
> 4297 bool renorm = !(flags & ENQUEUE_WAKEUP) || (flags & ENQUEUE_MIGRATED);
> 4298 bool curr = cfs_rq->curr == se;
> 4299
> 4300 /*
> 4301 * If we're the current task, we must renormalise before calling
> 4302 * update_curr().
> 4303 */
> 4304 if (renorm && curr)
> 4305 se->vruntime += cfs_rq->min_vruntime;
> 4306
> 4307 update_curr(cfs_rq);
> 4308
> 4309 /*
> 4310 * Otherwise, renormalise after, such that we're placed at the current
> 4311 * moment in time, instead of some random moment in the past. Being
> 4312 * placed in the past could significantly boost this task to the
> 4313 * fairness detriment of existing tasks.
> 4314 */
> 4315 if (renorm && !curr)
> 4316 se->vruntime += cfs_rq->min_vruntime;
> 4317
> 4318 /*
> 4319 * When enqueuing a sched_entity, we must:
> 4320 * - Update loads to have both entity and cfs_rq synced with now.
> 4321 * - Add its load to cfs_rq->runnable_avg
> 4322 * - For group_entity, update its weight to reflect the new share of
> 4323 * its group cfs_rq
> 4324 * - Add its new weight to cfs_rq->load.weight
> 4325 */
> 4326 update_load_avg(cfs_rq, se, UPDATE_TG | DO_ATTACH);
> 4327 se_update_runnable(se);
> 4328 update_cfs_group(se);
> 4329 account_entity_enqueue(cfs_rq, se);
> 4330
> 4331 if (flags & ENQUEUE_WAKEUP)
> 4332 place_entity(cfs_rq, se, 0);
> 4333
> 4334 check_schedstat_required();
> 4335 update_stats_enqueue_fair(cfs_rq, se, flags);
> 4336 check_spread(cfs_rq, se);
> 4337 if (!curr)
> 4338 __enqueue_entity(cfs_rq, se);
> 4339 se->on_rq = 1;
> 4340
> 4341 if (cfs_rq->nr_running == 1) {
> 4342 check_enqueue_throttle(cfs_rq);
>> 4343 if (!throttled_hierarchy(cfs_rq))
> 4344 list_add_leaf_cfs_rq(cfs_rq);
> 4345 }
> 4346 }
> 4347
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 2/2] sched/fair: optimize and simplify rq leaf_cfs_rq_list
2022-05-26 7:13 ` [PATCH v2 2/2] sched/fair: optimize and simplify rq leaf_cfs_rq_list Chengming Zhou
2022-05-26 8:53 ` kernel test robot
@ 2022-05-26 10:46 ` kernel test robot
1 sibling, 0 replies; 7+ messages in thread
From: kernel test robot @ 2022-05-26 10:46 UTC (permalink / raw)
To: Chengming Zhou, mingo, peterz, juri.lelli, vincent.guittot,
dietmar.eggemann, rostedt, bsegall, mgorman, bristot, vschneid,
odin
Cc: llvm, kbuild-all, linux-kernel, duanxiongchun, songmuchun,
Chengming Zhou
Hi Chengming,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on tip/sched/core]
[also build test ERROR on tip/master linus/master v5.18 next-20220526]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/intel-lab-lkp/linux/commits/Chengming-Zhou/sched-fair-optimize-and-simplify-rq-leaf_cfs_rq_list/20220526-151850
base: https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 991d8d8142cad94f9c5c05db25e67fa83d6f772a
config: arm-randconfig-r014-20220524 (https://download.01.org/0day-ci/archive/20220526/202205261834.2QOwksAg-lkp@intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project 3d546191ad9d7d2ad2c7928204b9de51deafa675)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install arm cross compiling tool for clang build
# apt-get install binutils-arm-linux-gnueabi
# https://github.com/intel-lab-lkp/linux/commit/cb2b1810aeb3f8f290a932f3e625ab9df1110054
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Chengming-Zhou/sched-fair-optimize-and-simplify-rq-leaf_cfs_rq_list/20220526-151850
git checkout cb2b1810aeb3f8f290a932f3e625ab9df1110054
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=arm SHELL=/bin/bash
If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
kernel/sched/fair.c:645:5: warning: no previous prototype for function 'sched_update_scaling' [-Wmissing-prototypes]
int sched_update_scaling(void)
^
kernel/sched/fair.c:645:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
int sched_update_scaling(void)
^
static
>> kernel/sched/fair.c:4343:8: error: call to undeclared function 'throttled_hierarchy'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
if (!throttled_hierarchy(cfs_rq))
^
kernel/sched/fair.c:5484:19: error: static declaration of 'throttled_hierarchy' follows non-static declaration
static inline int throttled_hierarchy(struct cfs_rq *cfs_rq)
^
kernel/sched/fair.c:4343:8: note: previous implicit declaration is here
if (!throttled_hierarchy(cfs_rq))
^
kernel/sched/fair.c:5495:6: warning: no previous prototype for function 'init_cfs_bandwidth' [-Wmissing-prototypes]
void init_cfs_bandwidth(struct cfs_bandwidth *cfs_b) {}
^
kernel/sched/fair.c:5495:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void init_cfs_bandwidth(struct cfs_bandwidth *cfs_b) {}
^
static
kernel/sched/fair.c:11654:6: warning: no previous prototype for function 'free_fair_sched_group' [-Wmissing-prototypes]
void free_fair_sched_group(struct task_group *tg) { }
^
kernel/sched/fair.c:11654:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void free_fair_sched_group(struct task_group *tg) { }
^
static
kernel/sched/fair.c:11656:5: warning: no previous prototype for function 'alloc_fair_sched_group' [-Wmissing-prototypes]
int alloc_fair_sched_group(struct task_group *tg, struct task_group *parent)
^
kernel/sched/fair.c:11656:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
int alloc_fair_sched_group(struct task_group *tg, struct task_group *parent)
^
static
kernel/sched/fair.c:11661:6: warning: no previous prototype for function 'online_fair_sched_group' [-Wmissing-prototypes]
void online_fair_sched_group(struct task_group *tg) { }
^
kernel/sched/fair.c:11661:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void online_fair_sched_group(struct task_group *tg) { }
^
static
kernel/sched/fair.c:11663:6: warning: no previous prototype for function 'unregister_fair_sched_group' [-Wmissing-prototypes]
void unregister_fair_sched_group(struct task_group *tg) { }
^
kernel/sched/fair.c:11663:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
void unregister_fair_sched_group(struct task_group *tg) { }
^
static
6 warnings and 2 errors generated.
Kconfig warnings: (for reference only)
WARNING: unmet direct dependencies detected for DRM_GEM_SHMEM_HELPER
Depends on HAS_IOMEM && DRM && MMU
Selected by
- DRM_SSD130X && HAS_IOMEM && DRM
vim +/throttled_hierarchy +4343 kernel/sched/fair.c
4263
4264 /*
4265 * MIGRATION
4266 *
4267 * dequeue
4268 * update_curr()
4269 * update_min_vruntime()
4270 * vruntime -= min_vruntime
4271 *
4272 * enqueue
4273 * update_curr()
4274 * update_min_vruntime()
4275 * vruntime += min_vruntime
4276 *
4277 * this way the vruntime transition between RQs is done when both
4278 * min_vruntime are up-to-date.
4279 *
4280 * WAKEUP (remote)
4281 *
4282 * ->migrate_task_rq_fair() (p->state == TASK_WAKING)
4283 * vruntime -= min_vruntime
4284 *
4285 * enqueue
4286 * update_curr()
4287 * update_min_vruntime()
4288 * vruntime += min_vruntime
4289 *
4290 * this way we don't have the most up-to-date min_vruntime on the originating
4291 * CPU and an up-to-date min_vruntime on the destination CPU.
4292 */
4293
4294 static void
4295 enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int flags)
4296 {
4297 bool renorm = !(flags & ENQUEUE_WAKEUP) || (flags & ENQUEUE_MIGRATED);
4298 bool curr = cfs_rq->curr == se;
4299
4300 /*
4301 * If we're the current task, we must renormalise before calling
4302 * update_curr().
4303 */
4304 if (renorm && curr)
4305 se->vruntime += cfs_rq->min_vruntime;
4306
4307 update_curr(cfs_rq);
4308
4309 /*
4310 * Otherwise, renormalise after, such that we're placed at the current
4311 * moment in time, instead of some random moment in the past. Being
4312 * placed in the past could significantly boost this task to the
4313 * fairness detriment of existing tasks.
4314 */
4315 if (renorm && !curr)
4316 se->vruntime += cfs_rq->min_vruntime;
4317
4318 /*
4319 * When enqueuing a sched_entity, we must:
4320 * - Update loads to have both entity and cfs_rq synced with now.
4321 * - Add its load to cfs_rq->runnable_avg
4322 * - For group_entity, update its weight to reflect the new share of
4323 * its group cfs_rq
4324 * - Add its new weight to cfs_rq->load.weight
4325 */
4326 update_load_avg(cfs_rq, se, UPDATE_TG | DO_ATTACH);
4327 se_update_runnable(se);
4328 update_cfs_group(se);
4329 account_entity_enqueue(cfs_rq, se);
4330
4331 if (flags & ENQUEUE_WAKEUP)
4332 place_entity(cfs_rq, se, 0);
4333
4334 check_schedstat_required();
4335 update_stats_enqueue_fair(cfs_rq, se, flags);
4336 check_spread(cfs_rq, se);
4337 if (!curr)
4338 __enqueue_entity(cfs_rq, se);
4339 se->on_rq = 1;
4340
4341 if (cfs_rq->nr_running == 1) {
4342 check_enqueue_throttle(cfs_rq);
> 4343 if (!throttled_hierarchy(cfs_rq))
4344 list_add_leaf_cfs_rq(cfs_rq);
4345 }
4346 }
4347
--
0-DAY CI Kernel Test Service
https://01.org/lkp
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2022-05-26 10:48 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-26 7:13 [PATCH v2 0/2] sched/fair: optimize and simplify rq leaf_cfs_rq_list Chengming Zhou
2022-05-26 7:13 ` [PATCH v2 1/2] sched/fair: fix propagate during synchronous attach/detach Chengming Zhou
2022-05-26 7:13 ` [PATCH v2 2/2] sched/fair: optimize and simplify rq leaf_cfs_rq_list Chengming Zhou
2022-05-26 8:53 ` kernel test robot
2022-05-26 10:25 ` [External] " Chengming Zhou
2022-05-26 10:25 ` Chengming Zhou
2022-05-26 10:46 ` kernel test robot
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.