sched/fair: Optimize !CONFIG_NO_HZ_COMMON CPU load updates
Some code in CPU load update only concern NO_HZ configs but it is built on all configurations. When NO_HZ isn't built, that code is harmless but just happens to take some useless ressources in CPU and memory: 1) one useless field in struct rq 2) jiffies record on every tick that is never used (cpu_load_update_periodic) 3) decay_load_missed is called two times on every tick to eventually return immediately with no action taken. And that function is dead code. For pure optimization purposes, lets conditionally build the NO_HZ related code. Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Byungchul Park <byungchul.park@lge.com> Cc: Chris Metcalf <cmetcalf@ezchip.com> Cc: Christoph Lameter <cl@linux.com> Cc: Luiz Capitulino <lcapitulino@redhat.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul E . McKenney <paulmck@linux.vnet.ibm.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Rik van Riel <riel@redhat.com> Cc: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/1461080211-16271-1-git-send-email-fweisbec@gmail.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
1f41906a6f
commit
9fd81dd5ce
|
@ -7381,8 +7381,6 @@ void __init sched_init(void)
|
||||||
for (j = 0; j < CPU_LOAD_IDX_MAX; j++)
|
for (j = 0; j < CPU_LOAD_IDX_MAX; j++)
|
||||||
rq->cpu_load[j] = 0;
|
rq->cpu_load[j] = 0;
|
||||||
|
|
||||||
rq->last_load_update_tick = jiffies;
|
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
rq->sd = NULL;
|
rq->sd = NULL;
|
||||||
rq->rd = NULL;
|
rq->rd = NULL;
|
||||||
|
@ -7401,12 +7399,13 @@ void __init sched_init(void)
|
||||||
|
|
||||||
rq_attach_root(rq, &def_root_domain);
|
rq_attach_root(rq, &def_root_domain);
|
||||||
#ifdef CONFIG_NO_HZ_COMMON
|
#ifdef CONFIG_NO_HZ_COMMON
|
||||||
|
rq->last_load_update_tick = jiffies;
|
||||||
rq->nohz_flags = 0;
|
rq->nohz_flags = 0;
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_NO_HZ_FULL
|
#ifdef CONFIG_NO_HZ_FULL
|
||||||
rq->last_sched_tick = 0;
|
rq->last_sched_tick = 0;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif /* CONFIG_SMP */
|
||||||
init_rq_hrtick(rq);
|
init_rq_hrtick(rq);
|
||||||
atomic_set(&rq->nr_iowait, 0);
|
atomic_set(&rq->nr_iowait, 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4491,7 +4491,7 @@ static void dequeue_task_fair(struct rq *rq, struct task_struct *p, int flags)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
|
#ifdef CONFIG_NO_HZ_COMMON
|
||||||
/*
|
/*
|
||||||
* per rq 'load' arrray crap; XXX kill this.
|
* per rq 'load' arrray crap; XXX kill this.
|
||||||
*/
|
*/
|
||||||
|
@ -4557,6 +4557,7 @@ decay_load_missed(unsigned long load, unsigned long missed_updates, int idx)
|
||||||
}
|
}
|
||||||
return load;
|
return load;
|
||||||
}
|
}
|
||||||
|
#endif /* CONFIG_NO_HZ_COMMON */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* __cpu_load_update - update the rq->cpu_load[] statistics
|
* __cpu_load_update - update the rq->cpu_load[] statistics
|
||||||
|
@ -4596,7 +4597,7 @@ decay_load_missed(unsigned long load, unsigned long missed_updates, int idx)
|
||||||
static void cpu_load_update(struct rq *this_rq, unsigned long this_load,
|
static void cpu_load_update(struct rq *this_rq, unsigned long this_load,
|
||||||
unsigned long pending_updates)
|
unsigned long pending_updates)
|
||||||
{
|
{
|
||||||
unsigned long tickless_load = this_rq->cpu_load[0];
|
unsigned long __maybe_unused tickless_load = this_rq->cpu_load[0];
|
||||||
int i, scale;
|
int i, scale;
|
||||||
|
|
||||||
this_rq->nr_load_updates++;
|
this_rq->nr_load_updates++;
|
||||||
|
@ -4609,6 +4610,7 @@ static void cpu_load_update(struct rq *this_rq, unsigned long this_load,
|
||||||
/* scale is effectively 1 << i now, and >> i divides by scale */
|
/* scale is effectively 1 << i now, and >> i divides by scale */
|
||||||
|
|
||||||
old_load = this_rq->cpu_load[i];
|
old_load = this_rq->cpu_load[i];
|
||||||
|
#ifdef CONFIG_NO_HZ_COMMON
|
||||||
old_load = decay_load_missed(old_load, pending_updates - 1, i);
|
old_load = decay_load_missed(old_load, pending_updates - 1, i);
|
||||||
if (tickless_load) {
|
if (tickless_load) {
|
||||||
old_load -= decay_load_missed(tickless_load, pending_updates - 1, i);
|
old_load -= decay_load_missed(tickless_load, pending_updates - 1, i);
|
||||||
|
@ -4619,6 +4621,7 @@ static void cpu_load_update(struct rq *this_rq, unsigned long this_load,
|
||||||
*/
|
*/
|
||||||
old_load += tickless_load;
|
old_load += tickless_load;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
new_load = this_load;
|
new_load = this_load;
|
||||||
/*
|
/*
|
||||||
* Round up the averaging division if load is increasing. This
|
* Round up the averaging division if load is increasing. This
|
||||||
|
@ -4731,8 +4734,10 @@ static inline void cpu_load_update_nohz(struct rq *this_rq,
|
||||||
|
|
||||||
static void cpu_load_update_periodic(struct rq *this_rq, unsigned long load)
|
static void cpu_load_update_periodic(struct rq *this_rq, unsigned long load)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_NO_HZ_COMMON
|
||||||
/* See the mess around cpu_load_update_nohz(). */
|
/* See the mess around cpu_load_update_nohz(). */
|
||||||
this_rq->last_load_update_tick = READ_ONCE(jiffies);
|
this_rq->last_load_update_tick = READ_ONCE(jiffies);
|
||||||
|
#endif
|
||||||
cpu_load_update(this_rq, load, 1);
|
cpu_load_update(this_rq, load, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -585,11 +585,13 @@ struct rq {
|
||||||
#endif
|
#endif
|
||||||
#define CPU_LOAD_IDX_MAX 5
|
#define CPU_LOAD_IDX_MAX 5
|
||||||
unsigned long cpu_load[CPU_LOAD_IDX_MAX];
|
unsigned long cpu_load[CPU_LOAD_IDX_MAX];
|
||||||
unsigned long last_load_update_tick;
|
|
||||||
#ifdef CONFIG_NO_HZ_COMMON
|
#ifdef CONFIG_NO_HZ_COMMON
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
unsigned long last_load_update_tick;
|
||||||
|
#endif /* CONFIG_SMP */
|
||||||
u64 nohz_stamp;
|
u64 nohz_stamp;
|
||||||
unsigned long nohz_flags;
|
unsigned long nohz_flags;
|
||||||
#endif
|
#endif /* CONFIG_NO_HZ_COMMON */
|
||||||
#ifdef CONFIG_NO_HZ_FULL
|
#ifdef CONFIG_NO_HZ_FULL
|
||||||
unsigned long last_sched_tick;
|
unsigned long last_sched_tick;
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue