[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] x86 Cx tracing: export the Cx exit reason (pending interrupt during Cx)



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1246269710 -3600
# Node ID 41317562d3329826ad1fadca16b519af335e7e72
# Parent  15cf6f0009d30d5a772d628f5381a01360d87502
x86 Cx tracing: export the Cx exit reason (pending interrupt during Cx)

Signed-off-by: Lu Guanqun <guanqun.lu@xxxxxxxxx>
---
 tools/xentrace/formats       |    2 +-
 xen/arch/x86/acpi/cpu_idle.c |   32 +++++++++++++++++++++++++++++---
 xen/include/xen/trace.h      |   15 +++++++++++++++
 3 files changed, 45 insertions(+), 4 deletions(-)

diff -r 15cf6f0009d3 -r 41317562d332 tools/xentrace/formats
--- a/tools/xentrace/formats    Mon Jun 29 11:00:56 2009 +0100
+++ b/tools/xentrace/formats    Mon Jun 29 11:01:50 2009 +0100
@@ -122,4 +122,4 @@ 0x0040f10f  CPU%(cpu)d  %(tsc)d (+%(relt
 
 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, acpi_pm_tick = %(2)d, expected = %(3)dus, predicted = %(4)dus ]
-0x00802002  CPU%(cpu)d  %(tsc)d (+%(reltsc)8d)  cpu_idle_exit   [ C%(1)d -> 
C0, 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, irq = %(3)d %(4)d %(5)d %(6)d ]
diff -r 15cf6f0009d3 -r 41317562d332 xen/arch/x86/acpi/cpu_idle.c
--- a/xen/arch/x86/acpi/cpu_idle.c      Mon Jun 29 11:00:56 2009 +0100
+++ b/xen/arch/x86/acpi/cpu_idle.c      Mon Jun 29 11:01:50 2009 +0100
@@ -190,6 +190,28 @@ static struct {
     unsigned int count;
 } c3_cpu_status = { .lock = SPIN_LOCK_UNLOCKED };
 
+static inline void trace_exit_reason(u32 *irq_traced)
+{
+#ifdef DEBUG
+    if ( unlikely(tb_init_done) )
+    {
+        int i, curbit;
+        u32 irr_status[8] = { 0 };
+
+        /* Get local apic IRR register */
+        for ( i = 0; i < 8; i++ )
+            irr_status[i] = apic_read(APIC_IRR + (i << 4));
+        i = 0;
+        curbit = find_first_bit((const unsigned long *)irr_status, 256);
+        while ( i < 4 && curbit < 256 )
+        {
+            irq_traced[i++] = curbit;
+            curbit = find_next_bit((const unsigned long *)irr_status, 256, 
curbit + 1);
+        }
+    }
+#endif
+}
+
 static void acpi_processor_idle(void)
 {
     struct acpi_processor_power *power = processor_powers[smp_processor_id()];
@@ -198,6 +220,7 @@ static void acpi_processor_idle(void)
     int sleep_ticks = 0;
     u32 t1, t2 = 0;
     u32 exp = 0, pred = 0;
+    u32 irq_traced[4] = { 0 };
 
     cpufreq_dbs_timer_suspend();
 
@@ -267,9 +290,10 @@ static void acpi_processor_idle(void)
             acpi_idle_do_entry(cx);
             /* Get end time (ticks) */
             t2 = inl(pmtmr_ioport);
+            trace_exit_reason(irq_traced);
             /* Trace cpu idle exit */
-            TRACE_2D(TRC_PM_IDLE_EXIT, cx->idx, t2);
-
+            TRACE_6D(TRC_PM_IDLE_EXIT, cx->idx, t2,
+                     irq_traced[0], irq_traced[1], irq_traced[2], 
irq_traced[3]);
             /* Re-enable interrupts */
             local_irq_enable();
             /* Compute time (ticks) that we were actually asleep */
@@ -326,8 +350,10 @@ static void acpi_processor_idle(void)
 
         /* recovering TSC */
         cstate_restore_tsc();
+        trace_exit_reason(irq_traced);
         /* Trace cpu idle exit */
-        TRACE_2D(TRC_PM_IDLE_EXIT, cx->idx, t2);
+        TRACE_6D(TRC_PM_IDLE_EXIT, cx->idx, t2,
+                 irq_traced[0], irq_traced[1], irq_traced[2], irq_traced[3]);
 
         if ( power->flags.bm_check && power->flags.bm_control )
         {
diff -r 15cf6f0009d3 -r 41317562d332 xen/include/xen/trace.h
--- a/xen/include/xen/trace.h   Mon Jun 29 11:00:56 2009 +0100
+++ b/xen/include/xen/trace.h   Mon Jun 29 11:01:50 2009 +0100
@@ -111,4 +111,19 @@ static inline void trace_var(u32 event, 
         }                                                       \
     } while ( 0 )
 
+#define TRACE_6D(_e,d1,d2,d3,d4,d5,d6)                             \
+    do {                                                        \
+        if ( unlikely(tb_init_done) )                           \
+        {                                                       \
+            u32 _d[6];                                          \
+            _d[0] = d1;                                         \
+            _d[1] = d2;                                         \
+            _d[2] = d3;                                         \
+            _d[3] = d4;                                         \
+            _d[4] = d5;                                         \
+            _d[5] = d6;                                         \
+            __trace_var(_e, 1, sizeof(*_d)*6, (unsigned char *)_d); \
+        }                                                       \
+    } while ( 0 )
+
 #endif /* __XEN_TRACE_H__ */

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.