This patch ports * diff-sched-add-WARN_ONs-to-debug-task-boosting Added to 042stab114_2
Assert that we never have a boosted entity under a throttled hierarchy. Also, do not panic if on set_next_entity we find a boosted entity being not on the list - just warn and carry on as if nothing happened. https://jira.sw.ru/browse/PSBM-44475 https://jira.sw.ru/browse/PSBM-50077 Signed-off-by: Vladimir Davydov <[email protected]> Reviewed-by: Kirill Tkhai <[email protected]> --- kernel/sched/fair.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 515685f77217..e39ed4c17464 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -909,9 +909,10 @@ update_stats_curr_start(struct cfs_rq *cfs_rq, struct sched_entity *se) #ifdef CONFIG_CFS_BANDWIDTH static inline void update_entity_boost(struct sched_entity *se) { - if (!entity_is_task(se)) + if (!entity_is_task(se)) { se->boosted = cfs_rq_has_boosted_entities(group_cfs_rq(se)); - else { + WARN_ON(se->boosted && cfs_rq_throttled(group_cfs_rq(se))); + } else { struct task_struct *p = task_of(se); if (unlikely(p != current)) @@ -943,6 +944,8 @@ static inline void __enqueue_boosted_entity(struct cfs_rq *cfs_rq, static inline void __dequeue_boosted_entity(struct cfs_rq *cfs_rq, struct sched_entity *se) { + if (WARN_ON(se->boost_node.next == LIST_POISON1)) + return; list_del(&se->boost_node); } @@ -953,8 +956,11 @@ static int enqueue_boosted_entity(struct cfs_rq *cfs_rq, if (se != cfs_rq->curr) __enqueue_boosted_entity(cfs_rq, se); se->boosted = 1; + WARN_ON(!entity_is_task(se) && + cfs_rq_throttled(group_cfs_rq(se))); return 1; - } + } else + WARN_ON(cfs_rq_throttled(group_cfs_rq(se))); return 0; } @@ -3847,6 +3853,8 @@ static void do_sched_cfs_slack_timer(struct cfs_bandwidth *cfs_b) */ static void check_enqueue_throttle(struct cfs_rq *cfs_rq) { + WARN_ON(cfs_rq_has_boosted_entities(cfs_rq)); + if (!cfs_bandwidth_used()) return; @@ -4150,8 +4158,10 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags) } else if (boost) { for_each_sched_entity(se) { cfs_rq = cfs_rq_of(se); - if (!enqueue_boosted_entity(cfs_rq, se)) + if (!enqueue_boosted_entity(cfs_rq, se)) { + WARN_ON(throttled_hierarchy(cfs_rq)); break; + } if (cfs_rq_throttled(cfs_rq)) unthrottle_cfs_rq(cfs_rq); } @@ -4213,8 +4223,10 @@ static void dequeue_task_fair(struct rq *rq, struct task_struct *p, int flags) cfs_rq = cfs_rq_of(se); cfs_rq->h_nr_running--; - if (cfs_rq_throttled(cfs_rq)) + if (cfs_rq_throttled(cfs_rq)) { + WARN_ON(boosted); break; + } if (boosted) boosted = dequeue_boosted_entity(cfs_rq, se); -- 2.1.4 _______________________________________________ Devel mailing list [email protected] https://lists.openvz.org/mailman/listinfo/devel
