aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArjan van de Ven <arjan@infradead.org>2009-09-19 07:35:33 -0400
committerIngo Molnar <mingo@elte.hu>2009-09-19 12:57:52 -0400
commit288f023e708efd89d77ce9acf977a33a623ae83d (patch)
treec3fe7d1bcab32f9dcfd16d92b76098ef4c125178
parent964a0b3d2b1b1cac1d01e29b635831b3d92a3fdd (diff)
tracing, x86, cpuidle: Move the end point of a C state in the power tracer
The "end of a C state" trace point currently happens before the code runs that corrects the TSC for having stopped during idle. The result of this is that the timestamp of the end-of-C-state event is garbage on cpus where the TSC stops during idle. This patch moves the end point of the C state to after the timekeeping engine of the kernel has been corrected. Signed-off-by: Arjan van de Ven <arjan@linux.intel.com> Cc: Len Brown <len.brown@intel.com> Cc: fweisbec@gmail.com Cc: peterz@infradead.org Cc: Paul Mackerras <paulus@samba.org> LKML-Reference: <20090919133533.139c2a46@infradead.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r--arch/x86/kernel/process.c3
-rw-r--r--drivers/cpuidle/cpuidle.c2
2 files changed, 2 insertions, 3 deletions
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
index 7b60e3906889..847ab4160315 100644
--- a/arch/x86/kernel/process.c
+++ b/arch/x86/kernel/process.c
@@ -309,7 +309,6 @@ void default_idle(void)
309 else 309 else
310 local_irq_enable(); 310 local_irq_enable();
311 current_thread_info()->status |= TS_POLLING; 311 current_thread_info()->status |= TS_POLLING;
312 trace_power_end(0);
313 } else { 312 } else {
314 local_irq_enable(); 313 local_irq_enable();
315 /* loop is done by the caller */ 314 /* loop is done by the caller */
@@ -377,7 +376,6 @@ void mwait_idle_with_hints(unsigned long ax, unsigned long cx)
377 if (!need_resched()) 376 if (!need_resched())
378 __mwait(ax, cx); 377 __mwait(ax, cx);
379 } 378 }
380 trace_power_end(0);
381} 379}
382 380
383/* Default MONITOR/MWAIT with no hints, used for default C1 state */ 381/* Default MONITOR/MWAIT with no hints, used for default C1 state */
@@ -394,7 +392,6 @@ static void mwait_idle(void)
394 __sti_mwait(0, 0); 392 __sti_mwait(0, 0);
395 else 393 else
396 local_irq_enable(); 394 local_irq_enable();
397 trace_power_end(0);
398 } else 395 } else
399 local_irq_enable(); 396 local_irq_enable();
400} 397}
diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c
index 8504a2108557..ad41f19b8e3f 100644
--- a/drivers/cpuidle/cpuidle.c
+++ b/drivers/cpuidle/cpuidle.c
@@ -17,6 +17,7 @@
17#include <linux/cpuidle.h> 17#include <linux/cpuidle.h>
18#include <linux/ktime.h> 18#include <linux/ktime.h>
19#include <linux/hrtimer.h> 19#include <linux/hrtimer.h>
20#include <trace/events/power.h>
20 21
21#include "cpuidle.h" 22#include "cpuidle.h"
22 23
@@ -91,6 +92,7 @@ static void cpuidle_idle_call(void)
91 /* give the governor an opportunity to reflect on the outcome */ 92 /* give the governor an opportunity to reflect on the outcome */
92 if (cpuidle_curr_governor->reflect) 93 if (cpuidle_curr_governor->reflect)
93 cpuidle_curr_governor->reflect(dev); 94 cpuidle_curr_governor->reflect(dev);
95 trace_power_end(0);
94} 96}
95 97
96/** 98/**