sched/fair: Use reweight_entity() for set_user_nice()
Now that we directly change load_avg and propagate that change into the sums, sys_nice() and co should do the same, otherwise its possible to confuse load accounting when we migrate near the weight change. Fixes-by: Josef Bacik <josef@toxicpanda.com> Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org> [ Added changelog, fixed the call condition. ] Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: linux-kernel@vger.kernel.org Link: http://lkml.kernel.org/r/20170517095045.GA8420@linaro.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:

کامیت شده توسط
Ingo Molnar

والد
840c5abca4
کامیت
9059393e4e
@@ -2776,6 +2776,43 @@ static inline void
|
||||
dequeue_load_avg(struct cfs_rq *cfs_rq, struct sched_entity *se) { }
|
||||
#endif
|
||||
|
||||
static void reweight_entity(struct cfs_rq *cfs_rq, struct sched_entity *se,
|
||||
unsigned long weight)
|
||||
{
|
||||
if (se->on_rq) {
|
||||
/* commit outstanding execution time */
|
||||
if (cfs_rq->curr == se)
|
||||
update_curr(cfs_rq);
|
||||
account_entity_dequeue(cfs_rq, se);
|
||||
dequeue_runnable_load_avg(cfs_rq, se);
|
||||
}
|
||||
dequeue_load_avg(cfs_rq, se);
|
||||
|
||||
update_load_set(&se->load, weight);
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
se->avg.load_avg = div_u64(se_weight(se) * se->avg.load_sum,
|
||||
LOAD_AVG_MAX - 1024 + se->avg.period_contrib);
|
||||
#endif
|
||||
|
||||
enqueue_load_avg(cfs_rq, se);
|
||||
if (se->on_rq) {
|
||||
account_entity_enqueue(cfs_rq, se);
|
||||
enqueue_runnable_load_avg(cfs_rq, se);
|
||||
}
|
||||
}
|
||||
|
||||
void reweight_task(struct task_struct *p, int prio)
|
||||
{
|
||||
struct sched_entity *se = &p->se;
|
||||
struct cfs_rq *cfs_rq = cfs_rq_of(se);
|
||||
struct load_weight *load = &se->load;
|
||||
unsigned long weight = scale_load(sched_prio_to_weight[prio]);
|
||||
|
||||
reweight_entity(cfs_rq, se, weight);
|
||||
load->inv_weight = sched_prio_to_wmult[prio];
|
||||
}
|
||||
|
||||
#ifdef CONFIG_FAIR_GROUP_SCHED
|
||||
# ifdef CONFIG_SMP
|
||||
/*
|
||||
@@ -2878,32 +2915,6 @@ static long calc_cfs_shares(struct cfs_rq *cfs_rq)
|
||||
}
|
||||
# endif /* CONFIG_SMP */
|
||||
|
||||
static void reweight_entity(struct cfs_rq *cfs_rq, struct sched_entity *se,
|
||||
unsigned long weight)
|
||||
{
|
||||
if (se->on_rq) {
|
||||
/* commit outstanding execution time */
|
||||
if (cfs_rq->curr == se)
|
||||
update_curr(cfs_rq);
|
||||
account_entity_dequeue(cfs_rq, se);
|
||||
dequeue_runnable_load_avg(cfs_rq, se);
|
||||
}
|
||||
dequeue_load_avg(cfs_rq, se);
|
||||
|
||||
update_load_set(&se->load, weight);
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
se->avg.load_avg = div_u64(se_weight(se) * se->avg.load_sum,
|
||||
LOAD_AVG_MAX - 1024 + se->avg.period_contrib);
|
||||
#endif
|
||||
|
||||
enqueue_load_avg(cfs_rq, se);
|
||||
if (se->on_rq) {
|
||||
account_entity_enqueue(cfs_rq, se);
|
||||
enqueue_runnable_load_avg(cfs_rq, se);
|
||||
}
|
||||
}
|
||||
|
||||
static inline int throttled_hierarchy(struct cfs_rq *cfs_rq);
|
||||
|
||||
static void update_cfs_shares(struct sched_entity *se)
|
||||
|
مرجع در شماره جدید
Block a user