diff options
author | Thomas Renninger <trenn@suse.de> | 2011-01-07 05:29:44 -0500 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2011-01-12 18:05:16 -0500 |
commit | f77cfe4ea21760268c0277fa3e4b02dfd2a2c2f4 (patch) | |
tree | ffd83ee874d1cbe062cd70cade50c017725ba586 /drivers/cpuidle/cpuidle.c | |
parent | f878133bf022717b880d0e0995b8f91436fd605c (diff) |
cpuidle/x86/perf: fix power:cpu_idle double end events and throw cpu_idle events from the cpuidle layer
Currently intel_idle and acpi_idle driver show double cpu_idle "exit idle"
events -> this patch fixes it and makes cpu_idle events throwing less complex.
It also introduces cpu_idle events for all architectures which use
the cpuidle subsystem, namely:
- arch/arm/mach-at91/cpuidle.c
- arch/arm/mach-davinci/cpuidle.c
- arch/arm/mach-kirkwood/cpuidle.c
- arch/arm/mach-omap2/cpuidle34xx.c
- arch/drivers/acpi/processor_idle.c (for all cases, not only mwait)
- arch/x86/kernel/process.c (did throw events before, but was a mess)
- drivers/idle/intel_idle.c (did throw events before)
Convention should be:
Fire cpu_idle events inside the current pm_idle function (not somewhere
down the the callee tree) to keep things easy.
Current possible pm_idle functions in X86:
c1e_idle, poll_idle, cpuidle_idle_call, mwait_idle, default_idle
-> this is really easy is now.
This affects userspace:
The type field of the cpu_idle power event can now direclty get
mapped to:
/sys/devices/system/cpu/cpuX/cpuidle/stateX/{name,desc,usage,time,...}
instead of throwing very CPU/mwait specific values.
This change is not visible for the intel_idle driver.
For the acpi_idle driver it should only be visible if the vendor
misses out C-states in his BIOS.
Another (perf timechart) patch reads out cpuidle info of cpu_idle
events from:
/sys/.../cpuidle/stateX/*, then the cpuidle events are mapped
to the correct C-/cpuidle state again, even if e.g. vendors miss
out C-states in their BIOS and for example only export C1 and C3.
-> everything is fine.
Signed-off-by: Thomas Renninger <trenn@suse.de>
CC: Robert Schoene <robert.schoene@tu-dresden.de>
CC: Jean Pihet <j-pihet@ti.com>
CC: Arjan van de Ven <arjan@linux.intel.com>
CC: Ingo Molnar <mingo@elte.hu>
CC: Frederic Weisbecker <fweisbec@gmail.com>
CC: linux-pm@lists.linux-foundation.org
CC: linux-acpi@vger.kernel.org
CC: linux-kernel@vger.kernel.org
CC: linux-perf-users@vger.kernel.org
CC: linux-omap@vger.kernel.org
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/cpuidle/cpuidle.c')
-rw-r--r-- | drivers/cpuidle/cpuidle.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c index 386888f10df0..e4855c33f897 100644 --- a/drivers/cpuidle/cpuidle.c +++ b/drivers/cpuidle/cpuidle.c | |||
@@ -96,7 +96,15 @@ static void cpuidle_idle_call(void) | |||
96 | 96 | ||
97 | /* enter the state and update stats */ | 97 | /* enter the state and update stats */ |
98 | dev->last_state = target_state; | 98 | dev->last_state = target_state; |
99 | |||
100 | trace_power_start(POWER_CSTATE, next_state, dev->cpu); | ||
101 | trace_cpu_idle(next_state, dev->cpu); | ||
102 | |||
99 | dev->last_residency = target_state->enter(dev, target_state); | 103 | dev->last_residency = target_state->enter(dev, target_state); |
104 | |||
105 | trace_power_end(dev->cpu); | ||
106 | trace_cpu_idle(PWR_EVENT_EXIT, dev->cpu); | ||
107 | |||
100 | if (dev->last_state) | 108 | if (dev->last_state) |
101 | target_state = dev->last_state; | 109 | target_state = dev->last_state; |
102 | 110 | ||
@@ -106,8 +114,6 @@ static void cpuidle_idle_call(void) | |||
106 | /* give the governor an opportunity to reflect on the outcome */ | 114 | /* give the governor an opportunity to reflect on the outcome */ |
107 | if (cpuidle_curr_governor->reflect) | 115 | if (cpuidle_curr_governor->reflect) |
108 | cpuidle_curr_governor->reflect(dev); | 116 | cpuidle_curr_governor->reflect(dev); |
109 | trace_power_end(smp_processor_id()); | ||
110 | trace_cpu_idle(PWR_EVENT_EXIT, smp_processor_id()); | ||
111 | } | 117 | } |
112 | 118 | ||
113 | /** | 119 | /** |