All of lore.kernel.org
 help / color / mirror / Atom feed
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 19:26:45 +0200	[thread overview]
Message-ID: <1287595605.3488.52.camel@twins> (raw)
In-Reply-To: <1287584073.3488.22.camel@twins>



OK, how does this work for people? I find my idle load is still a tad
high, but maybe I'm not patient enough.

---
 include/linux/sched.h    |    8 ++++++++
 kernel/sched.c           |   32 ++++++++++++++++++++++++++------
 kernel/sched_idletask.c  |    1 -
 kernel/time/tick-sched.c |    2 ++
 4 files changed, 36 insertions(+), 7 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..f214222 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,36 @@ 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_sub(this_rq->calc_load_inactive, &calc_load_tasks_idle);
+		/*
+		 * Undo the _fold_active() from _account_idle(). This
+		 * avoids us loosing active tasks and creating a negative
+		 * bias
+		 */
+		this_rq->calc_load_active -= this_rq->calc_load_inactive;
+	}
+}
+
 static long calc_load_fold_idle(void)
 {
 	long delta = 0;
@@ -3128,16 +3151,13 @@ static long calc_load_fold_idle(void)
 	/*
 	 * Its got a race, we don't care...
 	 */
+	atomic_inc(&calc_load_seq);
 	if (atomic_long_read(&calc_load_tasks_idle))
 		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 */


  parent reply	other threads:[~2010-10-20 17: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
2010-10-20 17:26           ` Peter Zijlstra [this message]
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=1287595605.3488.52.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.