aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2009-03-19 10:08:48 +0000
committerKeir Fraser <keir.fraser@citrix.com>2009-03-19 10:08:48 +0000
commit93d17a53a36a921ab6acbfa8fa7d28f8e466dc0b (patch)
treed7d4b0191500fd5b46017c9a0b4143ff5c1194be
parentd532e54c26d054c9ba97ecb0429ddfb7842e2f52 (diff)
downloadxen-93d17a53a36a921ab6acbfa8fa7d28f8e466dc0b.tar.gz
xen-93d17a53a36a921ab6acbfa8fa7d28f8e466dc0b.tar.bz2
xen-93d17a53a36a921ab6acbfa8fa7d28f8e466dc0b.zip
xentrace: Add acpi pm tick output to idle tracing
The reason is that tsc stops and it causes the inaccuracy. And later we can write some scripts based on this patch. Signed-off-by: Guanqun Lu <guanqun.lu@intel.com>
-rw-r--r--tools/xentrace/formats4
-rw-r--r--xen/arch/x86/acpi/cpu_idle.c12
2 files changed, 8 insertions, 8 deletions
diff --git a/tools/xentrace/formats b/tools/xentrace/formats
index 5d84eec6b3..42744a7352 100644
--- a/tools/xentrace/formats
+++ b/tools/xentrace/formats
@@ -118,5 +118,5 @@
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 ]
+0x00802001 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) cpu_idle_entry [ C0 -> C%(1)d, acpi_pm_tick = %(2)d ]
+0x00802002 CPU%(cpu)d %(tsc)d (+%(reltsc)8d) cpu_idle_exit [ C%(1)d -> C0, acpi_pm_tick = %(2)d ]
diff --git a/xen/arch/x86/acpi/cpu_idle.c b/xen/arch/x86/acpi/cpu_idle.c
index 29a372c90f..ede3ec1df6 100644
--- a/xen/arch/x86/acpi/cpu_idle.c
+++ b/xen/arch/x86/acpi/cpu_idle.c
@@ -245,16 +245,16 @@ static void acpi_processor_idle(void)
case ACPI_STATE_C2:
if ( cx->type == ACPI_STATE_C1 || local_apic_timer_c2_ok )
{
- /* Trace cpu idle entry */
- TRACE_1D(TRC_PM_IDLE_ENTRY, cx->idx);
/* Get start time (ticks) */
t1 = inl(pmtmr_ioport);
+ /* Trace cpu idle entry */
+ TRACE_2D(TRC_PM_IDLE_ENTRY, cx->idx, t1);
/* 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, cx->idx);
+ TRACE_2D(TRC_PM_IDLE_EXIT, cx->idx, t2);
/* Re-enable interrupts */
local_irq_enable();
@@ -293,8 +293,6 @@ static void acpi_processor_idle(void)
ACPI_FLUSH_CPU_CACHE();
}
- /* Trace cpu idle entry */
- TRACE_1D(TRC_PM_IDLE_ENTRY, cx->idx);
/*
* Before invoking C3, be aware that TSC/APIC timer may be
* stopped by H/W. Without carefully handling of TSC/APIC stop issues,
@@ -305,6 +303,8 @@ static void acpi_processor_idle(void)
/* Get start time (ticks) */
t1 = inl(pmtmr_ioport);
+ /* Trace cpu idle entry */
+ TRACE_2D(TRC_PM_IDLE_ENTRY, cx->idx, t1);
/* Invoke C3 */
acpi_idle_do_entry(cx);
/* Get end time (ticks) */
@@ -313,7 +313,7 @@ static void acpi_processor_idle(void)
/* recovering TSC */
cstate_restore_tsc();
/* Trace cpu idle exit */
- TRACE_1D(TRC_PM_IDLE_EXIT, cx->idx);
+ TRACE_2D(TRC_PM_IDLE_EXIT, cx->idx, t2);
if ( power->flags.bm_check && power->flags.bm_control )
{