You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
2.9 KiB
74 lines
2.9 KiB
From: Thomas Renninger <trenn@suse.de>
|
|
Subject: x86 cpufreq: Make trace_power_frequency cpufreq driver independent
|
|
Patch-Mainline: submitted - please revert after 2.6.35 (whether it's in or not)
|
|
References: none
|
|
|
|
and fix the broken case if a core's frequency depends on others.
|
|
|
|
trace_power_frequency was only implemented in a rather ungeneric way
|
|
in acpi-cpufreq driver's target() function only.
|
|
-> Move the call to trace_power_frequency to
|
|
cpufreq.c:cpufreq_notify_transition() where CPUFREQ_POSTCHANGE
|
|
notifier is triggered.
|
|
This will support power frequency tracing by all cpufreq drivers
|
|
|
|
trace_power_frequency did not trace frequency changes correctly when
|
|
the userspace governor was used or when CPU cores' frequency depend
|
|
on each other.
|
|
-> Moving this into the CPUFREQ_POSTCHANGE notifier and pass the cpu
|
|
which gets switched automatically fixes this.
|
|
|
|
Robert Schoene provided some important fixes on top of my initial
|
|
quick shot version which are integrated in this patch:
|
|
- Forgot some changes in power_end trace (TP_printk/variable names)
|
|
- Variable dummy in power_end must now be cpu_id
|
|
- Use static 64 bit variable instead of unsigned int for cpu_id
|
|
|
|
Signed-off-by: Thomas Renninger <trenn@suse.de>
|
|
CC: davej@redhat.com
|
|
CC: arjan@infradead.org
|
|
CC: davej@redhat.com
|
|
CC: linux-kernel@vger.kernel.org
|
|
CC: robert.schoene@tu-dresden.de
|
|
Tested-by: robert.schoene@tu-dresden.de
|
|
Automatically created from "patches.trace/x86_cpufreq_make_trace_power_frequency_cpufreq_driver_independent.patch" by xen-port-patches.py
|
|
|
|
--- head-2010-04-29.orig/arch/x86/kernel/process-xen.c 2010-03-25 14:37:33.000000000 +0100
|
|
+++ head-2010-04-29/arch/x86/kernel/process-xen.c 2010-04-29 10:14:28.000000000 +0200
|
|
@@ -359,7 +359,7 @@ static inline int hlt_use_halt(void)
|
|
*/
|
|
void xen_idle(void)
|
|
{
|
|
- trace_power_start(POWER_CSTATE, 1);
|
|
+ trace_power_start(POWER_CSTATE, 1, smp_processor_id());
|
|
current_thread_info()->status &= ~TS_POLLING;
|
|
/*
|
|
* TS_POLLING-cleared state must be visible before we
|
|
@@ -425,7 +425,7 @@ EXPORT_SYMBOL_GPL(cpu_idle_wait);
|
|
*/
|
|
void mwait_idle_with_hints(unsigned long ax, unsigned long cx)
|
|
{
|
|
- trace_power_start(POWER_CSTATE, (ax>>4)+1);
|
|
+ trace_power_start(POWER_CSTATE, (ax>>4)+1, smp_processor_id());
|
|
if (!need_resched()) {
|
|
if (cpu_has(¤t_cpu_data, X86_FEATURE_CLFLUSH_MONITOR))
|
|
clflush((void *)¤t_thread_info()->flags);
|
|
@@ -441,7 +441,7 @@ void mwait_idle_with_hints(unsigned long
|
|
static void mwait_idle(void)
|
|
{
|
|
if (!need_resched()) {
|
|
- trace_power_start(POWER_CSTATE, 1);
|
|
+ trace_power_start(POWER_CSTATE, 1, smp_processor_id());
|
|
if (cpu_has(¤t_cpu_data, X86_FEATURE_CLFLUSH_MONITOR))
|
|
clflush((void *)¤t_thread_info()->flags);
|
|
|
|
@@ -463,7 +463,7 @@ static void mwait_idle(void)
|
|
*/
|
|
static void poll_idle(void)
|
|
{
|
|
- trace_power_start(POWER_CSTATE, 0);
|
|
+ trace_power_start(POWER_CSTATE, 0, smp_processor_id());
|
|
local_irq_enable();
|
|
while (!need_resched())
|
|
cpu_relax();
|