# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1224147102 -3600
# Node ID 819ab49deef1da3042d2c111d6c99c3de535dae0
# Parent 9404bcb6d32e2a3873289254a42b0dbf6663a41c
xentrace: trace power management events.
Signed-off-by: Guanqun Lu <guanqun.lu@xxxxxxxxx>
---
tools/xentrace/formats | 4 ++++
xen/arch/x86/acpi/cpu_idle.c | 15 +++++++++++++++
xen/drivers/cpufreq/utility.c | 7 +++++++
xen/include/public/trace.h | 10 ++++++++++
4 files changed, 36 insertions(+)
diff -r 9404bcb6d32e -r 819ab49deef1 tools/xentrace/formats
--- a/tools/xentrace/formats Thu Oct 16 09:50:18 2008 +0100
+++ b/tools/xentrace/formats Thu Oct 16 09:51:42 2008 +0100
@@ -116,3 +116,7 @@ 0x0040f10e CPU%(cpu)d %(tsc)d (+%(relt
0x0040f10e CPU%(cpu)d %(tsc)d (+%(reltsc)8d) shadow_emulate_resync_full
[ gfn = 0x%(1)16x ]
0x0040f00f CPU%(cpu)d %(tsc)d (+%(reltsc)8d) shadow_emulate_resync_only
[ gfn = 0x%(1)08x ]
0x0040f10f CPU%(cpu)d %(tsc)d (+%(reltsc)8d) shadow_emulate_resync_only
[ gfn = 0x%(1)16x ]
+
+0x00801001 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) cpu_freq_change [ %(1)dMHz ->
%(2)dMHz ]
+0x00802001 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) cpu_idle_entry [ C0 -> C%(1)d
]
+0x00802002 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) cpu_idle_exit [ C%(1)d -> C0
]
diff -r 9404bcb6d32e -r 819ab49deef1 xen/arch/x86/acpi/cpu_idle.c
--- a/xen/arch/x86/acpi/cpu_idle.c Thu Oct 16 09:50:18 2008 +0100
+++ b/xen/arch/x86/acpi/cpu_idle.c Thu Oct 16 09:51:42 2008 +0100
@@ -40,6 +40,7 @@
#include <xen/guest_access.h>
#include <xen/keyhandler.h>
#include <xen/cpuidle.h>
+#include <xen/trace.h>
#include <asm/cache.h>
#include <asm/io.h>
#include <asm/hpet.h>
@@ -251,6 +252,9 @@ static void acpi_processor_idle(void)
switch ( cx->type )
{
case ACPI_STATE_C1:
+ /* Trace cpu idle entry */
+ TRACE_1D(TRC_PM_IDLE_ENTRY, 1);
+
/*
* Invoke C1.
* Use the appropriate idle routine, the one that would
@@ -261,6 +265,9 @@ static void acpi_processor_idle(void)
else
acpi_safe_halt();
+ /* Trace cpu idle exit */
+ TRACE_1D(TRC_PM_IDLE_EXIT, 1);
+
/*
* TBD: Can't get time duration while in C1, as resumes
* go to an ISR rather than here. Need to instrument
@@ -272,12 +279,16 @@ static void acpi_processor_idle(void)
case ACPI_STATE_C2:
if ( local_apic_timer_c2_ok )
{
+ /* Trace cpu idle entry */
+ TRACE_1D(TRC_PM_IDLE_ENTRY, 2);
/* Get start time (ticks) */
t1 = inl(pmtmr_ioport);
/* Invoke C2 */
acpi_idle_do_entry(cx);
/* Get end time (ticks) */
t2 = inl(pmtmr_ioport);
+ /* Trace cpu idle exit */
+ TRACE_1D(TRC_PM_IDLE_EXIT, 2);
/* Re-enable interrupts */
local_irq_enable();
@@ -316,6 +327,8 @@ static void acpi_processor_idle(void)
ACPI_FLUSH_CPU_CACHE();
}
+ /* Trace cpu idle entry */
+ TRACE_1D(TRC_PM_IDLE_ENTRY, cx - &power->states[0]);
/*
* Before invoking C3, be aware that TSC/APIC timer may be
* stopped by H/W. Without carefully handling of TSC/APIC stop issues,
@@ -335,6 +348,8 @@ static void acpi_processor_idle(void)
/* recovering TSC */
cstate_restore_tsc();
+ /* Trace cpu idle exit */
+ TRACE_1D(TRC_PM_IDLE_EXIT, cx - &power->states[0]);
if ( power->flags.bm_check && power->flags.bm_control )
{
diff -r 9404bcb6d32e -r 819ab49deef1 xen/drivers/cpufreq/utility.c
--- a/xen/drivers/cpufreq/utility.c Thu Oct 16 09:50:18 2008 +0100
+++ b/xen/drivers/cpufreq/utility.c Thu Oct 16 09:51:42 2008 +0100
@@ -27,6 +27,7 @@
#include <xen/types.h>
#include <xen/sched.h>
#include <xen/timer.h>
+#include <xen/trace.h>
#include <asm/config.h>
#include <acpi/cpufreq/cpufreq.h>
#include <public/sysctl.h>
@@ -293,7 +294,13 @@ int __cpufreq_driver_target(struct cpufr
int retval = -EINVAL;
if (cpu_online(policy->cpu) && cpufreq_driver->target)
+ {
+ unsigned int prev_freq = policy->cur;
+
retval = cpufreq_driver->target(policy, target_freq, relation);
+ if ( retval == 0 )
+ TRACE_2D(TRC_PM_FREQ_CHANGE, prev_freq/1000, policy->cur/1000);
+ }
return retval;
}
diff -r 9404bcb6d32e -r 819ab49deef1 xen/include/public/trace.h
--- a/xen/include/public/trace.h Thu Oct 16 09:50:18 2008 +0100
+++ b/xen/include/public/trace.h Thu Oct 16 09:51:42 2008 +0100
@@ -38,6 +38,7 @@
#define TRC_MEM 0x0010f000 /* Xen memory trace */
#define TRC_PV 0x0020f000 /* Xen PV traces */
#define TRC_SHADOW 0x0040f000 /* Xen shadow tracing */
+#define TRC_PM 0x0080f000 /* Xen power management trace */
#define TRC_ALL 0x0ffff000
#define TRC_HD_TO_EVENT(x) ((x)&0x0fffffff)
#define TRC_HD_CYCLE_FLAG (1UL<<31)
@@ -146,6 +147,15 @@
#define TRC_HVM_LMSW (TRC_HVM_HANDLER + 0x19)
#define TRC_HVM_LMSW64 (TRC_HVM_HANDLER + TRC_64_FLAG + 0x19)
+/* trace subclasses for power management */
+#define TRC_PM_FREQ 0x00801000 /* xen cpu freq events */
+#define TRC_PM_IDLE 0x00802000 /* xen cpu idle events */
+
+/* trace events for per class */
+#define TRC_PM_FREQ_CHANGE (TRC_PM_FREQ + 0x01)
+#define TRC_PM_IDLE_ENTRY (TRC_PM_IDLE + 0x01)
+#define TRC_PM_IDLE_EXIT (TRC_PM_IDLE + 0x02)
+
/* This structure represents a single trace buffer record. */
struct t_rec {
uint32_t event:28;
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|