aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/process.c
diff options
context:
space:
mode:
authorArjan van de Ven <arjan@linux.intel.com>2009-09-17 10:11:28 -0400
committerIngo Molnar <mingo@elte.hu>2009-09-19 05:42:12 -0400
commit6161352142d5fed4cd753b32e5ccde66e705b14e (patch)
treed64d0e3e6c44440181ddb5d1bc6884067fee0749 /arch/x86/kernel/process.c
parentfd39e055c4fefa4553efc9030f9903afdc6ee323 (diff)
tracing, perf: Convert the power tracer into an event tracer
This patch converts the existing power tracer into an event tracer, so that power events (C states and frequency changes) can be tracked via "perf". This also removes the perl script that was used to demo the tracer; its functionality is being replaced entirely with timechart. Signed-off-by: Arjan van de Ven <arjan@linux.intel.com> Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Paul Mackerras <paulus@samba.org> Cc: Frederic Weisbecker <fweisbec@gmail.com> LKML-Reference: <20090912130542.6d314860@infradead.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/process.c')
-rw-r--r--arch/x86/kernel/process.c28
1 files changed, 9 insertions, 19 deletions
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
index 071166a4ba83..7b60e3906889 100644
--- a/arch/x86/kernel/process.c
+++ b/arch/x86/kernel/process.c
@@ -9,7 +9,7 @@
9#include <linux/pm.h> 9#include <linux/pm.h>
10#include <linux/clockchips.h> 10#include <linux/clockchips.h>
11#include <linux/random.h> 11#include <linux/random.h>
12#include <trace/power.h> 12#include <trace/events/power.h>
13#include <asm/system.h> 13#include <asm/system.h>
14#include <asm/apic.h> 14#include <asm/apic.h>
15#include <asm/syscalls.h> 15#include <asm/syscalls.h>
@@ -25,9 +25,6 @@ EXPORT_SYMBOL(idle_nomwait);
25 25
26struct kmem_cache *task_xstate_cachep; 26struct kmem_cache *task_xstate_cachep;
27 27
28DEFINE_TRACE(power_start);
29DEFINE_TRACE(power_end);
30
31int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src) 28int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
32{ 29{
33 *dst = *src; 30 *dst = *src;
@@ -299,9 +296,7 @@ static inline int hlt_use_halt(void)
299void default_idle(void) 296void default_idle(void)
300{ 297{
301 if (hlt_use_halt()) { 298 if (hlt_use_halt()) {
302 struct power_trace it; 299 trace_power_start(POWER_CSTATE, 1);
303
304 trace_power_start(&it, POWER_CSTATE, 1);
305 current_thread_info()->status &= ~TS_POLLING; 300 current_thread_info()->status &= ~TS_POLLING;
306 /* 301 /*
307 * TS_POLLING-cleared state must be visible before we 302 * TS_POLLING-cleared state must be visible before we
@@ -314,7 +309,7 @@ void default_idle(void)
314 else 309 else
315 local_irq_enable(); 310 local_irq_enable();
316 current_thread_info()->status |= TS_POLLING; 311 current_thread_info()->status |= TS_POLLING;
317 trace_power_end(&it); 312 trace_power_end(0);
318 } else { 313 } else {
319 local_irq_enable(); 314 local_irq_enable();
320 /* loop is done by the caller */ 315 /* loop is done by the caller */
@@ -372,9 +367,7 @@ EXPORT_SYMBOL_GPL(cpu_idle_wait);
372 */ 367 */
373void mwait_idle_with_hints(unsigned long ax, unsigned long cx) 368void mwait_idle_with_hints(unsigned long ax, unsigned long cx)
374{ 369{
375 struct power_trace it; 370 trace_power_start(POWER_CSTATE, (ax>>4)+1);
376
377 trace_power_start(&it, POWER_CSTATE, (ax>>4)+1);
378 if (!need_resched()) { 371 if (!need_resched()) {
379 if (cpu_has(&current_cpu_data, X86_FEATURE_CLFLUSH_MONITOR)) 372 if (cpu_has(&current_cpu_data, X86_FEATURE_CLFLUSH_MONITOR))
380 clflush((void *)&current_thread_info()->flags); 373 clflush((void *)&current_thread_info()->flags);
@@ -384,15 +377,14 @@ void mwait_idle_with_hints(unsigned long ax, unsigned long cx)
384 if (!need_resched()) 377 if (!need_resched())
385 __mwait(ax, cx); 378 __mwait(ax, cx);
386 } 379 }
387 trace_power_end(&it); 380 trace_power_end(0);
388} 381}
389 382
390/* Default MONITOR/MWAIT with no hints, used for default C1 state */ 383/* Default MONITOR/MWAIT with no hints, used for default C1 state */
391static void mwait_idle(void) 384static void mwait_idle(void)
392{ 385{
393 struct power_trace it;
394 if (!need_resched()) { 386 if (!need_resched()) {
395 trace_power_start(&it, POWER_CSTATE, 1); 387 trace_power_start(POWER_CSTATE, 1);
396 if (cpu_has(&current_cpu_data, X86_FEATURE_CLFLUSH_MONITOR)) 388 if (cpu_has(&current_cpu_data, X86_FEATURE_CLFLUSH_MONITOR))
397 clflush((void *)&current_thread_info()->flags); 389 clflush((void *)&current_thread_info()->flags);
398 390
@@ -402,7 +394,7 @@ static void mwait_idle(void)
402 __sti_mwait(0, 0); 394 __sti_mwait(0, 0);
403 else 395 else
404 local_irq_enable(); 396 local_irq_enable();
405 trace_power_end(&it); 397 trace_power_end(0);
406 } else 398 } else
407 local_irq_enable(); 399 local_irq_enable();
408} 400}
@@ -414,13 +406,11 @@ static void mwait_idle(void)
414 */ 406 */
415static void poll_idle(void) 407static void poll_idle(void)
416{ 408{
417 struct power_trace it; 409 trace_power_start(POWER_CSTATE, 0);
418
419 trace_power_start(&it, POWER_CSTATE, 0);
420 local_irq_enable(); 410 local_irq_enable();
421 while (!need_resched()) 411 while (!need_resched())
422 cpu_relax(); 412 cpu_relax();
423 trace_power_end(&it); 413 trace_power_end(0);
424} 414}
425 415
426/* 416/*