|
@@ -1102,6 +1102,26 @@ static inline u64 __synchronize_entity_decay(struct sched_entity *se)
|
|
|
return decays;
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_FAIR_GROUP_SCHED
|
|
|
+static inline void __update_cfs_rq_tg_load_contrib(struct cfs_rq *cfs_rq,
|
|
|
+ int force_update)
|
|
|
+{
|
|
|
+ struct task_group *tg = cfs_rq->tg;
|
|
|
+ s64 tg_contrib;
|
|
|
+
|
|
|
+ tg_contrib = cfs_rq->runnable_load_avg + cfs_rq->blocked_load_avg;
|
|
|
+ tg_contrib -= cfs_rq->tg_load_contrib;
|
|
|
+
|
|
|
+ if (force_update || abs64(tg_contrib) > cfs_rq->tg_load_contrib / 8) {
|
|
|
+ atomic64_add(tg_contrib, &tg->load_avg);
|
|
|
+ cfs_rq->tg_load_contrib += tg_contrib;
|
|
|
+ }
|
|
|
+}
|
|
|
+#else
|
|
|
+static inline void __update_cfs_rq_tg_load_contrib(struct cfs_rq *cfs_rq,
|
|
|
+ int force_update) {}
|
|
|
+#endif
|
|
|
+
|
|
|
/* Compute the current contribution to load_avg by se, return any delta */
|
|
|
static long __update_entity_load_avg_contrib(struct sched_entity *se)
|
|
|
{
|
|
@@ -1172,6 +1192,8 @@ static void update_cfs_rq_blocked_load(struct cfs_rq *cfs_rq, int force_update)
|
|
|
atomic64_add(decays, &cfs_rq->decay_counter);
|
|
|
cfs_rq->last_decay = now;
|
|
|
}
|
|
|
+
|
|
|
+ __update_cfs_rq_tg_load_contrib(cfs_rq, force_update);
|
|
|
}
|
|
|
|
|
|
static inline void update_rq_runnable_avg(struct rq *rq, int runnable)
|