diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/Kconfig | 2 | ||||
-rw-r--r-- | arch/x86/include/asm/ftrace.h | 4 | ||||
-rw-r--r-- | arch/x86/kernel/Makefile | 4 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c | 4 | ||||
-rw-r--r-- | arch/x86/kernel/entry_32.S | 17 | ||||
-rw-r--r-- | arch/x86/kernel/ftrace.c | 90 | ||||
-rw-r--r-- | arch/x86/kernel/process.c | 16 |
7 files changed, 108 insertions, 29 deletions
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index e49a4fd718fe..0842b1127684 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -29,7 +29,7 @@ config X86 | |||
29 | select HAVE_FTRACE_MCOUNT_RECORD | 29 | select HAVE_FTRACE_MCOUNT_RECORD |
30 | select HAVE_DYNAMIC_FTRACE | 30 | select HAVE_DYNAMIC_FTRACE |
31 | select HAVE_FUNCTION_TRACER | 31 | select HAVE_FUNCTION_TRACER |
32 | select HAVE_FUNCTION_RET_TRACER if X86_32 | 32 | select HAVE_FUNCTION_GRAPH_TRACER if X86_32 |
33 | select HAVE_FUNCTION_TRACE_MCOUNT_TEST | 33 | select HAVE_FUNCTION_TRACE_MCOUNT_TEST |
34 | select HAVE_KVM if ((X86_32 && !X86_VOYAGER && !X86_VISWS && !X86_NUMAQ) || X86_64) | 34 | select HAVE_KVM if ((X86_32 && !X86_VOYAGER && !X86_VISWS && !X86_NUMAQ) || X86_64) |
35 | select HAVE_ARCH_KGDB if !X86_VOYAGER | 35 | select HAVE_ARCH_KGDB if !X86_VOYAGER |
diff --git a/arch/x86/include/asm/ftrace.h b/arch/x86/include/asm/ftrace.h index 754a3e082f94..7e61b4ceb9a4 100644 --- a/arch/x86/include/asm/ftrace.h +++ b/arch/x86/include/asm/ftrace.h | |||
@@ -28,7 +28,7 @@ struct dyn_arch_ftrace { | |||
28 | #endif /* __ASSEMBLY__ */ | 28 | #endif /* __ASSEMBLY__ */ |
29 | #endif /* CONFIG_FUNCTION_TRACER */ | 29 | #endif /* CONFIG_FUNCTION_TRACER */ |
30 | 30 | ||
31 | #ifdef CONFIG_FUNCTION_RET_TRACER | 31 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER |
32 | 32 | ||
33 | #ifndef __ASSEMBLY__ | 33 | #ifndef __ASSEMBLY__ |
34 | 34 | ||
@@ -51,6 +51,6 @@ struct ftrace_ret_stack { | |||
51 | extern void return_to_handler(void); | 51 | extern void return_to_handler(void); |
52 | 52 | ||
53 | #endif /* __ASSEMBLY__ */ | 53 | #endif /* __ASSEMBLY__ */ |
54 | #endif /* CONFIG_FUNCTION_RET_TRACER */ | 54 | #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ |
55 | 55 | ||
56 | #endif /* _ASM_X86_FTRACE_H */ | 56 | #endif /* _ASM_X86_FTRACE_H */ |
diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile index af2bc36ca1c4..64939a0c3986 100644 --- a/arch/x86/kernel/Makefile +++ b/arch/x86/kernel/Makefile | |||
@@ -14,7 +14,7 @@ CFLAGS_REMOVE_paravirt-spinlocks.o = -pg | |||
14 | CFLAGS_REMOVE_ftrace.o = -pg | 14 | CFLAGS_REMOVE_ftrace.o = -pg |
15 | endif | 15 | endif |
16 | 16 | ||
17 | ifdef CONFIG_FUNCTION_RET_TRACER | 17 | ifdef CONFIG_FUNCTION_GRAPH_TRACER |
18 | # Don't trace __switch_to() but let it for function tracer | 18 | # Don't trace __switch_to() but let it for function tracer |
19 | CFLAGS_REMOVE_process_32.o = -pg | 19 | CFLAGS_REMOVE_process_32.o = -pg |
20 | endif | 20 | endif |
@@ -70,7 +70,7 @@ obj-$(CONFIG_X86_LOCAL_APIC) += apic.o nmi.o | |||
70 | obj-$(CONFIG_X86_IO_APIC) += io_apic.o | 70 | obj-$(CONFIG_X86_IO_APIC) += io_apic.o |
71 | obj-$(CONFIG_X86_REBOOTFIXUPS) += reboot_fixups_32.o | 71 | obj-$(CONFIG_X86_REBOOTFIXUPS) += reboot_fixups_32.o |
72 | obj-$(CONFIG_DYNAMIC_FTRACE) += ftrace.o | 72 | obj-$(CONFIG_DYNAMIC_FTRACE) += ftrace.o |
73 | obj-$(CONFIG_FUNCTION_RET_TRACER) += ftrace.o | 73 | obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o |
74 | obj-$(CONFIG_KEXEC) += machine_kexec_$(BITS).o | 74 | obj-$(CONFIG_KEXEC) += machine_kexec_$(BITS).o |
75 | obj-$(CONFIG_KEXEC) += relocate_kernel_$(BITS).o crash.o | 75 | obj-$(CONFIG_KEXEC) += relocate_kernel_$(BITS).o crash.o |
76 | obj-$(CONFIG_CRASH_DUMP) += crash_dump_$(BITS).o | 76 | obj-$(CONFIG_CRASH_DUMP) += crash_dump_$(BITS).o |
diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c index 8e48c5d4467d..88ea02dcb622 100644 --- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c +++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <linux/cpufreq.h> | 33 | #include <linux/cpufreq.h> |
34 | #include <linux/compiler.h> | 34 | #include <linux/compiler.h> |
35 | #include <linux/dmi.h> | 35 | #include <linux/dmi.h> |
36 | #include <linux/ftrace.h> | ||
36 | 37 | ||
37 | #include <linux/acpi.h> | 38 | #include <linux/acpi.h> |
38 | #include <acpi/processor.h> | 39 | #include <acpi/processor.h> |
@@ -391,6 +392,7 @@ static int acpi_cpufreq_target(struct cpufreq_policy *policy, | |||
391 | unsigned int next_perf_state = 0; /* Index into perf table */ | 392 | unsigned int next_perf_state = 0; /* Index into perf table */ |
392 | unsigned int i; | 393 | unsigned int i; |
393 | int result = 0; | 394 | int result = 0; |
395 | struct power_trace it; | ||
394 | 396 | ||
395 | dprintk("acpi_cpufreq_target %d (%d)\n", target_freq, policy->cpu); | 397 | dprintk("acpi_cpufreq_target %d (%d)\n", target_freq, policy->cpu); |
396 | 398 | ||
@@ -427,6 +429,8 @@ static int acpi_cpufreq_target(struct cpufreq_policy *policy, | |||
427 | } | 429 | } |
428 | } | 430 | } |
429 | 431 | ||
432 | trace_power_mark(&it, POWER_PSTATE, next_perf_state); | ||
433 | |||
430 | switch (data->cpu_feature) { | 434 | switch (data->cpu_feature) { |
431 | case SYSTEM_INTEL_MSR_CAPABLE: | 435 | case SYSTEM_INTEL_MSR_CAPABLE: |
432 | cmd.type = SYSTEM_INTEL_MSR_CAPABLE; | 436 | cmd.type = SYSTEM_INTEL_MSR_CAPABLE; |
diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S index 74defe21ba42..958af86186c4 100644 --- a/arch/x86/kernel/entry_32.S +++ b/arch/x86/kernel/entry_32.S | |||
@@ -1174,6 +1174,11 @@ ftrace_call: | |||
1174 | popl %edx | 1174 | popl %edx |
1175 | popl %ecx | 1175 | popl %ecx |
1176 | popl %eax | 1176 | popl %eax |
1177 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | ||
1178 | .globl ftrace_graph_call | ||
1179 | ftrace_graph_call: | ||
1180 | jmp ftrace_stub | ||
1181 | #endif | ||
1177 | 1182 | ||
1178 | .globl ftrace_stub | 1183 | .globl ftrace_stub |
1179 | ftrace_stub: | 1184 | ftrace_stub: |
@@ -1188,9 +1193,9 @@ ENTRY(mcount) | |||
1188 | 1193 | ||
1189 | cmpl $ftrace_stub, ftrace_trace_function | 1194 | cmpl $ftrace_stub, ftrace_trace_function |
1190 | jnz trace | 1195 | jnz trace |
1191 | #ifdef CONFIG_FUNCTION_RET_TRACER | 1196 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER |
1192 | cmpl $ftrace_stub, ftrace_function_return | 1197 | cmpl $ftrace_stub, ftrace_graph_return |
1193 | jnz ftrace_return_caller | 1198 | jnz ftrace_graph_caller |
1194 | #endif | 1199 | #endif |
1195 | .globl ftrace_stub | 1200 | .globl ftrace_stub |
1196 | ftrace_stub: | 1201 | ftrace_stub: |
@@ -1215,8 +1220,8 @@ END(mcount) | |||
1215 | #endif /* CONFIG_DYNAMIC_FTRACE */ | 1220 | #endif /* CONFIG_DYNAMIC_FTRACE */ |
1216 | #endif /* CONFIG_FUNCTION_TRACER */ | 1221 | #endif /* CONFIG_FUNCTION_TRACER */ |
1217 | 1222 | ||
1218 | #ifdef CONFIG_FUNCTION_RET_TRACER | 1223 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER |
1219 | ENTRY(ftrace_return_caller) | 1224 | ENTRY(ftrace_graph_caller) |
1220 | cmpl $0, function_trace_stop | 1225 | cmpl $0, function_trace_stop |
1221 | jne ftrace_stub | 1226 | jne ftrace_stub |
1222 | 1227 | ||
@@ -1230,7 +1235,7 @@ ENTRY(ftrace_return_caller) | |||
1230 | popl %ecx | 1235 | popl %ecx |
1231 | popl %eax | 1236 | popl %eax |
1232 | ret | 1237 | ret |
1233 | END(ftrace_return_caller) | 1238 | END(ftrace_graph_caller) |
1234 | 1239 | ||
1235 | .globl return_to_handler | 1240 | .globl return_to_handler |
1236 | return_to_handler: | 1241 | return_to_handler: |
diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c index bb137f7297ed..7ef914e6a2f6 100644 --- a/arch/x86/kernel/ftrace.c +++ b/arch/x86/kernel/ftrace.c | |||
@@ -111,7 +111,6 @@ static void ftrace_mod_code(void) | |||
111 | */ | 111 | */ |
112 | mod_code_status = probe_kernel_write(mod_code_ip, mod_code_newcode, | 112 | mod_code_status = probe_kernel_write(mod_code_ip, mod_code_newcode, |
113 | MCOUNT_INSN_SIZE); | 113 | MCOUNT_INSN_SIZE); |
114 | |||
115 | } | 114 | } |
116 | 115 | ||
117 | void ftrace_nmi_enter(void) | 116 | void ftrace_nmi_enter(void) |
@@ -323,9 +322,53 @@ int __init ftrace_dyn_arch_init(void *data) | |||
323 | } | 322 | } |
324 | #endif | 323 | #endif |
325 | 324 | ||
326 | #ifdef CONFIG_FUNCTION_RET_TRACER | 325 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER |
326 | |||
327 | #ifdef CONFIG_DYNAMIC_FTRACE | ||
328 | extern void ftrace_graph_call(void); | ||
329 | |||
330 | static int ftrace_mod_jmp(unsigned long ip, | ||
331 | int old_offset, int new_offset) | ||
332 | { | ||
333 | unsigned char code[MCOUNT_INSN_SIZE]; | ||
334 | |||
335 | if (probe_kernel_read(code, (void *)ip, MCOUNT_INSN_SIZE)) | ||
336 | return -EFAULT; | ||
337 | |||
338 | if (code[0] != 0xe9 || old_offset != *(int *)(&code[1])) | ||
339 | return -EINVAL; | ||
340 | |||
341 | *(int *)(&code[1]) = new_offset; | ||
342 | |||
343 | if (do_ftrace_mod_code(ip, &code)) | ||
344 | return -EPERM; | ||
345 | |||
346 | return 0; | ||
347 | } | ||
348 | |||
349 | int ftrace_enable_ftrace_graph_caller(void) | ||
350 | { | ||
351 | unsigned long ip = (unsigned long)(&ftrace_graph_call); | ||
352 | int old_offset, new_offset; | ||
353 | |||
354 | old_offset = (unsigned long)(&ftrace_stub) - (ip + MCOUNT_INSN_SIZE); | ||
355 | new_offset = (unsigned long)(&ftrace_graph_caller) - (ip + MCOUNT_INSN_SIZE); | ||
356 | |||
357 | return ftrace_mod_jmp(ip, old_offset, new_offset); | ||
358 | } | ||
359 | |||
360 | int ftrace_disable_ftrace_graph_caller(void) | ||
361 | { | ||
362 | unsigned long ip = (unsigned long)(&ftrace_graph_call); | ||
363 | int old_offset, new_offset; | ||
364 | |||
365 | old_offset = (unsigned long)(&ftrace_graph_caller) - (ip + MCOUNT_INSN_SIZE); | ||
366 | new_offset = (unsigned long)(&ftrace_stub) - (ip + MCOUNT_INSN_SIZE); | ||
367 | |||
368 | return ftrace_mod_jmp(ip, old_offset, new_offset); | ||
369 | } | ||
327 | 370 | ||
328 | #ifndef CONFIG_DYNAMIC_FTRACE | 371 | #else /* CONFIG_DYNAMIC_FTRACE */ |
329 | 372 | ||
330 | /* | 373 | /* |
331 | * These functions are picked from those used on | 374 | * These functions are picked from those used on |
@@ -343,11 +386,12 @@ void ftrace_nmi_exit(void) | |||
343 | { | 386 | { |
344 | atomic_dec(&in_nmi); | 387 | atomic_dec(&in_nmi); |
345 | } | 388 | } |
389 | |||
346 | #endif /* !CONFIG_DYNAMIC_FTRACE */ | 390 | #endif /* !CONFIG_DYNAMIC_FTRACE */ |
347 | 391 | ||
348 | /* Add a function return address to the trace stack on thread info.*/ | 392 | /* Add a function return address to the trace stack on thread info.*/ |
349 | static int push_return_trace(unsigned long ret, unsigned long long time, | 393 | static int push_return_trace(unsigned long ret, unsigned long long time, |
350 | unsigned long func) | 394 | unsigned long func, int *depth) |
351 | { | 395 | { |
352 | int index; | 396 | int index; |
353 | 397 | ||
@@ -365,21 +409,22 @@ static int push_return_trace(unsigned long ret, unsigned long long time, | |||
365 | current->ret_stack[index].ret = ret; | 409 | current->ret_stack[index].ret = ret; |
366 | current->ret_stack[index].func = func; | 410 | current->ret_stack[index].func = func; |
367 | current->ret_stack[index].calltime = time; | 411 | current->ret_stack[index].calltime = time; |
412 | *depth = index; | ||
368 | 413 | ||
369 | return 0; | 414 | return 0; |
370 | } | 415 | } |
371 | 416 | ||
372 | /* Retrieve a function return address to the trace stack on thread info.*/ | 417 | /* Retrieve a function return address to the trace stack on thread info.*/ |
373 | static void pop_return_trace(unsigned long *ret, unsigned long long *time, | 418 | static void pop_return_trace(struct ftrace_graph_ret *trace, unsigned long *ret) |
374 | unsigned long *func, unsigned long *overrun) | ||
375 | { | 419 | { |
376 | int index; | 420 | int index; |
377 | 421 | ||
378 | index = current->curr_ret_stack; | 422 | index = current->curr_ret_stack; |
379 | *ret = current->ret_stack[index].ret; | 423 | *ret = current->ret_stack[index].ret; |
380 | *func = current->ret_stack[index].func; | 424 | trace->func = current->ret_stack[index].func; |
381 | *time = current->ret_stack[index].calltime; | 425 | trace->calltime = current->ret_stack[index].calltime; |
382 | *overrun = atomic_read(¤t->trace_overrun); | 426 | trace->overrun = atomic_read(¤t->trace_overrun); |
427 | trace->depth = index; | ||
383 | current->curr_ret_stack--; | 428 | current->curr_ret_stack--; |
384 | } | 429 | } |
385 | 430 | ||
@@ -389,13 +434,14 @@ static void pop_return_trace(unsigned long *ret, unsigned long long *time, | |||
389 | */ | 434 | */ |
390 | unsigned long ftrace_return_to_handler(void) | 435 | unsigned long ftrace_return_to_handler(void) |
391 | { | 436 | { |
392 | struct ftrace_retfunc trace; | 437 | struct ftrace_graph_ret trace; |
393 | pop_return_trace(&trace.ret, &trace.calltime, &trace.func, | 438 | unsigned long ret; |
394 | &trace.overrun); | 439 | |
440 | pop_return_trace(&trace, &ret); | ||
395 | trace.rettime = cpu_clock(raw_smp_processor_id()); | 441 | trace.rettime = cpu_clock(raw_smp_processor_id()); |
396 | ftrace_function_return(&trace); | 442 | ftrace_graph_return(&trace); |
397 | 443 | ||
398 | return trace.ret; | 444 | return ret; |
399 | } | 445 | } |
400 | 446 | ||
401 | /* | 447 | /* |
@@ -407,6 +453,7 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr) | |||
407 | unsigned long old; | 453 | unsigned long old; |
408 | unsigned long long calltime; | 454 | unsigned long long calltime; |
409 | int faulted; | 455 | int faulted; |
456 | struct ftrace_graph_ent trace; | ||
410 | unsigned long return_hooker = (unsigned long) | 457 | unsigned long return_hooker = (unsigned long) |
411 | &return_to_handler; | 458 | &return_to_handler; |
412 | 459 | ||
@@ -440,20 +487,27 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr) | |||
440 | ); | 487 | ); |
441 | 488 | ||
442 | if (WARN_ON(faulted)) { | 489 | if (WARN_ON(faulted)) { |
443 | unregister_ftrace_return(); | 490 | unregister_ftrace_graph(); |
444 | return; | 491 | return; |
445 | } | 492 | } |
446 | 493 | ||
447 | if (WARN_ON(!__kernel_text_address(old))) { | 494 | if (WARN_ON(!__kernel_text_address(old))) { |
448 | unregister_ftrace_return(); | 495 | unregister_ftrace_graph(); |
449 | *parent = old; | 496 | *parent = old; |
450 | return; | 497 | return; |
451 | } | 498 | } |
452 | 499 | ||
453 | calltime = cpu_clock(raw_smp_processor_id()); | 500 | calltime = cpu_clock(raw_smp_processor_id()); |
454 | 501 | ||
455 | if (push_return_trace(old, calltime, self_addr) == -EBUSY) | 502 | if (push_return_trace(old, calltime, |
503 | self_addr, &trace.depth) == -EBUSY) { | ||
456 | *parent = old; | 504 | *parent = old; |
505 | return; | ||
506 | } | ||
507 | |||
508 | trace.func = self_addr; | ||
509 | ftrace_graph_entry(&trace); | ||
510 | |||
457 | } | 511 | } |
458 | 512 | ||
459 | #endif /* CONFIG_FUNCTION_RET_TRACER */ | 513 | #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ |
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index c622772744d8..c27af49a4ede 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c | |||
@@ -7,6 +7,7 @@ | |||
7 | #include <linux/module.h> | 7 | #include <linux/module.h> |
8 | #include <linux/pm.h> | 8 | #include <linux/pm.h> |
9 | #include <linux/clockchips.h> | 9 | #include <linux/clockchips.h> |
10 | #include <linux/ftrace.h> | ||
10 | #include <asm/system.h> | 11 | #include <asm/system.h> |
11 | 12 | ||
12 | unsigned long idle_halt; | 13 | unsigned long idle_halt; |
@@ -100,6 +101,9 @@ static inline int hlt_use_halt(void) | |||
100 | void default_idle(void) | 101 | void default_idle(void) |
101 | { | 102 | { |
102 | if (hlt_use_halt()) { | 103 | if (hlt_use_halt()) { |
104 | struct power_trace it; | ||
105 | |||
106 | trace_power_start(&it, POWER_CSTATE, 1); | ||
103 | current_thread_info()->status &= ~TS_POLLING; | 107 | current_thread_info()->status &= ~TS_POLLING; |
104 | /* | 108 | /* |
105 | * TS_POLLING-cleared state must be visible before we | 109 | * TS_POLLING-cleared state must be visible before we |
@@ -112,6 +116,7 @@ void default_idle(void) | |||
112 | else | 116 | else |
113 | local_irq_enable(); | 117 | local_irq_enable(); |
114 | current_thread_info()->status |= TS_POLLING; | 118 | current_thread_info()->status |= TS_POLLING; |
119 | trace_power_end(&it); | ||
115 | } else { | 120 | } else { |
116 | local_irq_enable(); | 121 | local_irq_enable(); |
117 | /* loop is done by the caller */ | 122 | /* loop is done by the caller */ |
@@ -154,24 +159,31 @@ EXPORT_SYMBOL_GPL(cpu_idle_wait); | |||
154 | */ | 159 | */ |
155 | void mwait_idle_with_hints(unsigned long ax, unsigned long cx) | 160 | void mwait_idle_with_hints(unsigned long ax, unsigned long cx) |
156 | { | 161 | { |
162 | struct power_trace it; | ||
163 | |||
164 | trace_power_start(&it, POWER_CSTATE, (ax>>4)+1); | ||
157 | if (!need_resched()) { | 165 | if (!need_resched()) { |
158 | __monitor((void *)¤t_thread_info()->flags, 0, 0); | 166 | __monitor((void *)¤t_thread_info()->flags, 0, 0); |
159 | smp_mb(); | 167 | smp_mb(); |
160 | if (!need_resched()) | 168 | if (!need_resched()) |
161 | __mwait(ax, cx); | 169 | __mwait(ax, cx); |
162 | } | 170 | } |
171 | trace_power_end(&it); | ||
163 | } | 172 | } |
164 | 173 | ||
165 | /* Default MONITOR/MWAIT with no hints, used for default C1 state */ | 174 | /* Default MONITOR/MWAIT with no hints, used for default C1 state */ |
166 | static void mwait_idle(void) | 175 | static void mwait_idle(void) |
167 | { | 176 | { |
177 | struct power_trace it; | ||
168 | if (!need_resched()) { | 178 | if (!need_resched()) { |
179 | trace_power_start(&it, POWER_CSTATE, 1); | ||
169 | __monitor((void *)¤t_thread_info()->flags, 0, 0); | 180 | __monitor((void *)¤t_thread_info()->flags, 0, 0); |
170 | smp_mb(); | 181 | smp_mb(); |
171 | if (!need_resched()) | 182 | if (!need_resched()) |
172 | __sti_mwait(0, 0); | 183 | __sti_mwait(0, 0); |
173 | else | 184 | else |
174 | local_irq_enable(); | 185 | local_irq_enable(); |
186 | trace_power_end(&it); | ||
175 | } else | 187 | } else |
176 | local_irq_enable(); | 188 | local_irq_enable(); |
177 | } | 189 | } |
@@ -183,9 +195,13 @@ static void mwait_idle(void) | |||
183 | */ | 195 | */ |
184 | static void poll_idle(void) | 196 | static void poll_idle(void) |
185 | { | 197 | { |
198 | struct power_trace it; | ||
199 | |||
200 | trace_power_start(&it, POWER_CSTATE, 0); | ||
186 | local_irq_enable(); | 201 | local_irq_enable(); |
187 | while (!need_resched()) | 202 | while (!need_resched()) |
188 | cpu_relax(); | 203 | cpu_relax(); |
204 | trace_power_end(&it); | ||
189 | } | 205 | } |
190 | 206 | ||
191 | /* | 207 | /* |