Messages in this thread Patch in this message | | | From | Chengming Zhou <> | Subject | [PATCH v3 1/2] sched/fair: fix propagate during synchronous attach/detach | Date | Thu, 26 May 2022 18:39:28 +0800 |
| |
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 906b2c7c48d1..c6da204f3068 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -11267,14 +11267,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
| |