FAILED: patch "[PATCH] sched/fair: Fix unthrottle_cfs_rq() for leaf_cfs_rq list" failed to apply to 5.6-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 5.6-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 39f23ce07b9355d05a64ae303ce20d1c4b92b957 Mon Sep 17 00:00:00 2001
From: Vincent Guittot <[email protected]>
Date: Wed, 13 May 2020 15:55:28 +0200
Subject: [PATCH] sched/fair: Fix unthrottle_cfs_rq() for leaf_cfs_rq list
Although not exactly identical, unthrottle_cfs_rq() and enqueue_task_fair() are quite close and follow the same sequence for enqueuing an entity in the cfs hierarchy. Modify unthrottle_cfs_rq() to use the same pattern as enqueue_task_fair(). This fixes a problem already faced with the latter and add an optimization in the last for_each_sched_entity loop.
Reported-by Tao Zhou <[email protected]>
kernel/sched/fair.c +30 -12
@@ -4774,7 +4774,6 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq)struct rq *rq =rq_of (cfs_rq);struct cfs_bandwidth *cfs_b =tg_cfs_bandwidth (cfs_rq->tg);struct sched_entity *se; -int enqueue =1 ;long task_delta, idle_task_delta; se = cfs_rq->tg->se[cpu_of (rq)];
@@ -4798,26 +4797,44 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq) idle_task_delta = cfs_rq->idle_h_nr_running;for_each_sched_entity (se) {if (se->on_rq) - enqueue =0 ; +break ; + cfs_rq =cfs_rq_of (se); +enqueue_entity (cfs_rq, se,ENQUEUE_WAKEUP ); + cfs_rq->h_nr_running += task_delta; + cfs_rq->idle_h_nr_running += idle_task_delta; + +/* end evaluation on encountering a throttled cfs_rq */ +if (cfs_rq_throttled (cfs_rq)) + goto unthrottle_throttle; + } + +for_each_sched_entity (se) { cfs_rq =cfs_rq_of (se); -if (enqueue) { -enqueue_entity (cfs_rq, se,ENQUEUE_WAKEUP ); - }else { -update_load_avg (cfs_rq, se,0 ); -se_update_runnable (se); - } + +update_load_avg (cfs_rq, se,UPDATE_TG ); +se_update_runnable (se); cfs_rq->h_nr_running += task_delta; cfs_rq->idle_h_nr_running += idle_task_delta; + +/* end evaluation on encountering a throttled cfs_rq */ if (cfs_rq_throttled (cfs_rq)) -break ; + 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 (cfs_rq)) +list_add_leaf_cfs_rq (cfs_rq); } -if (!se) -add_nr_running (rq, task_delta); +/* 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
@@ -4826,7 +4843,8 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq)for_each_sched_entity (se) { cfs_rq =cfs_rq_of (se); -list_add_leaf_cfs_rq (cfs_rq); +if (list_add_leaf_cfs_rq (cfs_rq)) +break ; }assert_list_leaf_cfs_rq (rq);
Quoted 6 lines · Le lundi 25 mai 2020 à 16:42:49 (+0200), [email protected] a écrit :
The patch below does not apply to the 5.6-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
This patch needs commit
b34cb07dde7c ("sched/fair: Fix enqueue_task_fair() warning some more") to be applied first. But then, it will not apply. The backport is :
[ Upstream commit 39f23ce07b9355d05a64ae303ce20d1c4b92b957 upstream ]
Although not exactly identical, unthrottle_cfs_rq() and enqueue_task_fair() are quite close and follow the same sequence for enqueuing an entity in the cfs hierarchy. Modify unthrottle_cfs_rq() to use the same pattern as enqueue_task_fair(). This fixes a problem already faced with the latter and add an optimization in the last for_each_sched_entity loop.
Reported-by Tao Zhou <[email protected]>
--- kernel/sched/fair.c | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-)
kernel/sched/fair.c +28 -8
@@ -4590,7 +4590,6 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq)struct rq *rq =rq_of (cfs_rq);struct cfs_bandwidth *cfs_b =tg_cfs_bandwidth (cfs_rq->tg);struct sched_entity *se; -int enqueue =1 ;long task_delta, idle_task_delta; se = cfs_rq->tg->se[cpu_of (rq)];
@@ -4614,21 +4613,41 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq) idle_task_delta = cfs_rq->idle_h_nr_running;for_each_sched_entity (se) {if (se->on_rq) - enqueue =0 ; +break ; + cfs_rq =cfs_rq_of (se); +enqueue_entity (cfs_rq, se,ENQUEUE_WAKEUP ); + + cfs_rq->h_nr_running += task_delta; + cfs_rq->idle_h_nr_running += idle_task_delta; +/* end evaluation on encountering a throttled cfs_rq */ +if (cfs_rq_throttled (cfs_rq)) + goto unthrottle_throttle; + } + +for_each_sched_entity (se) { cfs_rq =cfs_rq_of (se); -if (enqueue) -enqueue_entity (cfs_rq, se,ENQUEUE_WAKEUP ); + cfs_rq->h_nr_running += task_delta; cfs_rq->idle_h_nr_running += idle_task_delta; + +/* end evaluation on encountering a throttled cfs_rq */ if (cfs_rq_throttled (cfs_rq)) -break ; + 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 (cfs_rq)) +list_add_leaf_cfs_rq (cfs_rq); } -if (!se) -add_nr_running (rq, task_delta); +/* 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
@@ -4637,7 +4656,8 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq)for_each_sched_entity (se) { cfs_rq =cfs_rq_of (se); -list_add_leaf_cfs_rq (cfs_rq); +if (list_add_leaf_cfs_rq (cfs_rq)) +break ; }assert_list_leaf_cfs_rq (rq);
Signature · 1 line
2.17.1