From: Peter Zijlstra <peterz@infradead.org>
To: Damien Wyart <damien.wyart@free.fr>
Cc: Chase Douglas <chase.douglas@canonical.com>,
Ingo Molnar <mingo@elte.hu>,
tmhikaru@gmail.com, Thomas Gleixner <tglx@linutronix.de>,
linux-kernel@vger.kernel.org,
Venkatesh Pallipadi <venki@google.com>
Subject: Re: High CPU load when machine is idle (related to PROBLEM: Unusually high load average when idle in 2.6.35, 2.6.35.1 and later)
Date: Wed, 20 Oct 2010 16:25:49 +0200 [thread overview]
Message-ID: <1287584749.3488.26.camel@twins> (raw)
In-Reply-To: <1287584073.3488.22.camel@twins>
On Wed, 2010-10-20 at 16:14 +0200, Peter Zijlstra wrote:
> ---
> include/linux/sched.h | 8 ++++++++
> kernel/sched.c | 28 +++++++++++++++++++++-------
> kernel/sched_idletask.c | 1 -
> kernel/time/tick-sched.c | 2 ++
> 4 files changed, 31 insertions(+), 8 deletions(-)
>
> diff --git a/include/linux/sched.h b/include/linux/sched.h
> index 0383601..5311ef4 100644
> --- a/include/linux/sched.h
> +++ b/include/linux/sched.h
> @@ -145,6 +145,14 @@ extern unsigned long this_cpu_load(void);
>
> extern void calc_global_load(void);
>
> +#ifdef CONFIG_NO_HZ
> +extern void calc_load_account_idle(void);
> +extern void calc_load_account_nonidle(void);
> +#else
> +static inline void calc_load_account_idle(void) { }
> +static inline void calc_load_account_nonidle(void) { }
> +#endif
> +
> extern unsigned long get_parent_ip(unsigned long addr);
>
> struct seq_file;
> diff --git a/kernel/sched.c b/kernel/sched.c
> index abf8440..79a29e6 100644
> --- a/kernel/sched.c
> +++ b/kernel/sched.c
> @@ -526,6 +526,10 @@ struct rq {
> /* calc_load related fields */
> unsigned long calc_load_update;
> long calc_load_active;
> +#ifdef CONFIG_NO_HZ
> + long calc_load_inactive;
> + int calc_load_seq;
> +#endif
>
> #ifdef CONFIG_SCHED_HRTICK
> #ifdef CONFIG_SMP
> @@ -1833,7 +1837,6 @@ static void cfs_rq_set_shares(struct cfs_rq *cfs_rq, unsigned long shares)
> }
> #endif
>
> -static void calc_load_account_idle(struct rq *this_rq);
> static void update_sysctl(void);
> static int get_update_sysctl_factor(void);
> static void update_cpu_load(struct rq *this_rq);
> @@ -3111,16 +3114,29 @@ static long calc_load_fold_active(struct rq *this_rq)
> * When making the ILB scale, we should try to pull this in as well.
> */
> static atomic_long_t calc_load_tasks_idle;
> +static atomic_t calc_load_seq;
>
> -static void calc_load_account_idle(struct rq *this_rq)
> +void calc_load_account_idle(void)
> {
> + struct rq *this_rq = this_rq();
> long delta;
>
> delta = calc_load_fold_active(this_rq);
> + this_rq->calc_load_inactive = delta;
> + this_rq->calc_load_seq = atomic_read(&calc_load_seq);
> +
> if (delta)
> atomic_long_add(delta, &calc_load_tasks_idle);
> }
>
> +void calc_load_account_nonidle(void)
> +{
> + struct rq *this_rq = this_rq();
> +
> + if (atomic_read(&calc_load_seq) == this_rq->calc_load_seq)
> + atomic_long_add(this_rq->calc_load_inactive, &calc_load_tasks_idle);
So that should read: that atomic_long_sub()
Trouble is, load goes down with that patch fixed, it just never goes
up :/
> +}
> +
> static long calc_load_fold_idle(void)
> {
> long delta = 0;
> @@ -3128,16 +3144,14 @@ static long calc_load_fold_idle(void)
> /*
> * Its got a race, we don't care...
> */
> - if (atomic_long_read(&calc_load_tasks_idle))
> + if (atomic_long_read(&calc_load_tasks_idle)) {
> + atomic_inc(&calc_load_seq);
> delta = atomic_long_xchg(&calc_load_tasks_idle, 0);
> + }
>
> return delta;
> }
> #else
> -static void calc_load_account_idle(struct rq *this_rq)
> -{
> -}
> -
> static inline long calc_load_fold_idle(void)
> {
> return 0;
> diff --git a/kernel/sched_idletask.c b/kernel/sched_idletask.c
> index 9fa0f402..6ca191f 100644
> --- a/kernel/sched_idletask.c
> +++ b/kernel/sched_idletask.c
> @@ -23,7 +23,6 @@ static void check_preempt_curr_idle(struct rq *rq, struct task_struct *p, int fl
> static struct task_struct *pick_next_task_idle(struct rq *rq)
> {
> schedstat_inc(rq, sched_goidle);
> - calc_load_account_idle(rq);
> return rq->idle;
> }
>
> diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
> index 3e216e0..808abd7 100644
> --- a/kernel/time/tick-sched.c
> +++ b/kernel/time/tick-sched.c
> @@ -411,6 +411,7 @@ void tick_nohz_stop_sched_tick(int inidle)
> ts->tick_stopped = 1;
> ts->idle_jiffies = last_jiffies;
> rcu_enter_nohz();
> + calc_load_account_idle();
> }
>
> ts->idle_sleeps++;
> @@ -520,6 +521,7 @@ void tick_nohz_restart_sched_tick(void)
>
> ts->inidle = 0;
>
> + calc_load_account_nonidle();
> rcu_exit_nohz();
>
> /* Update jiffies first */
>
next prev parent reply other threads:[~2010-10-20 14:26 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-09-29 7:01 High CPU load when machine is idle Damien Wyart
2010-10-14 14:58 ` High CPU load when machine is idle (related to PROBLEM: Unusually high load average when idle in 2.6.35, 2.6.35.1 and later) Damien Wyart
2010-10-14 15:29 ` Chase Douglas
2010-10-14 15:56 ` Damien Wyart
2010-10-15 11:08 ` Peter Zijlstra
2010-10-18 12:32 ` Peter Zijlstra
2010-10-20 13:27 ` Damien Wyart
2010-10-20 13:30 ` Peter Zijlstra
2010-10-20 13:43 ` Peter Zijlstra
2010-10-20 14:14 ` Peter Zijlstra
2010-10-20 14:25 ` Peter Zijlstra [this message]
2010-10-20 17:26 ` Peter Zijlstra
2010-10-20 20:24 ` Damien Wyart
2010-10-21 1:48 ` tmhikaru
2010-10-21 1:53 ` tmhikaru
2010-10-21 8:22 ` Ingo Molnar
2010-10-21 8:57 ` tmhikaru
2010-10-21 18:36 ` tmhikaru
2010-10-22 1:37 ` tmhikaru
2010-10-21 12:09 ` Peter Zijlstra
2010-10-21 17:18 ` Venkatesh Pallipadi
2010-10-22 21:03 ` Venkatesh Pallipadi
2010-10-22 23:03 ` High CPU load when machine is idle (related to PROBLEM: Unusually high load average when idle in 2.6.35, 2.6.35.1 and later) Venkatesh Pallipadi
2010-10-23 2:13 ` tmhikaru
2010-10-25 10:12 ` Peter Zijlstra
2010-10-25 16:29 ` Venkatesh Pallipadi
2010-10-26 12:44 ` Peter Zijlstra
2010-10-26 14:05 ` Peter Zijlstra
2010-10-29 19:42 ` Peter Zijlstra
2010-11-09 18:55 ` Kyle McMartin
2010-11-09 19:02 ` Peter Zijlstra
2010-11-10 2:37 ` tmhikaru
2010-11-10 12:01 ` Peter Zijlstra
2010-11-10 3:45 ` Kyle McMartin
2010-11-10 12:00 ` Peter Zijlstra
2010-11-14 5:14 ` tmhikaru
2010-11-25 13:31 ` Damien Wyart
2010-11-25 14:03 ` Peter Zijlstra
2010-11-27 20:15 ` Peter Zijlstra
2010-11-28 4:26 ` Kyle McMartin
2010-11-28 11:40 ` Damien Wyart
2010-11-28 18:07 ` Valdis.Kletnieks
2010-11-29 11:38 ` Peter Zijlstra
2010-11-29 19:40 ` tmhikaru
2010-11-29 23:01 ` Peter Zijlstra
2010-11-30 14:59 ` Peter Zijlstra
2010-11-30 15:39 ` Kyle McMartin
2010-11-30 20:04 ` Kyle McMartin
2010-11-30 16:53 ` Damien Wyart
2010-11-30 17:29 ` Peter Zijlstra
2010-12-01 21:27 ` tmhikaru
2010-12-02 10:16 ` tmhikaru
2010-12-08 20:40 ` [tip:sched/urgent] sched: Cure more NO_HZ load average woes tip-bot for Peter Zijlstra
2010-11-30 20:01 ` High CPU load when machine is idle (related to PROBLEM: Unusually high load average when idle in 2.6.35, 2.6.35.1 and later) tmhikaru
2010-11-30 16:49 ` Damien Wyart
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1287584749.3488.26.camel@twins \
--to=peterz@infradead.org \
--cc=chase.douglas@canonical.com \
--cc=damien.wyart@free.fr \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=tglx@linutronix.de \
--cc=tmhikaru@gmail.com \
--cc=venki@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.