xentrace 1/7: Trace runstate changes.
authorKeir Fraser <keir.fraser@citrix.com>
Mon, 8 Sep 2008 14:47:47 +0000 (15:47 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Mon, 8 Sep 2008 14:47:47 +0000 (15:47 +0100)
Also, introduce SCHED_MIN and SCHED_VERBOSE, so that we can trace
just runstate changes if we want to.

Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
Signed-off-by: Trolle Selander <trolle.selander@eu.citrix.com>
xen/common/schedule.c
xen/include/public/trace.h

index 3b015b06acd2a3a0b02837347fd724a8bcd36b78..5aba30775b386595826549e19180c845594f045d 100644 (file)
@@ -63,12 +63,32 @@ static struct scheduler ops;
          (( ops.fn != NULL ) ? ops.fn( __VA_ARGS__ )      \
           : (typeof(ops.fn(__VA_ARGS__)))0 )
 
+static inline void trace_runstate_change(struct vcpu *v, int new_state)
+{
+    struct { uint32_t vcpu:16, domain:16; } d;
+    uint32_t event;
+
+    if ( likely(!tb_init_done) )
+        return;
+
+    d.vcpu = v->vcpu_id;
+    d.domain = v->domain->domain_id;
+
+    event = TRC_SCHED_RUNSTATE_CHANGE;
+    event |= ( v->runstate.state & 0x3 ) << 8;
+    event |= ( new_state & 0x3 ) << 4;
+
+    __trace_var(event, 1/*tsc*/, sizeof(d), (unsigned char *)&d);
+}
+
 static inline void vcpu_runstate_change(
     struct vcpu *v, int new_state, s_time_t new_entry_time)
 {
     ASSERT(v->runstate.state != new_state);
     ASSERT(spin_is_locked(&per_cpu(schedule_data,v->processor).schedule_lock));
 
+    trace_runstate_change(v, new_state);
+
     v->runstate.time[v->runstate.state] +=
         new_entry_time - v->runstate.state_entry_time;
     v->runstate.state_entry_time = new_entry_time;
index 8f43f6bed91edc5e77f933c69f78ece9fb029ca0..0e153cf3fd1538d7aa8ba6bfe95748b6c2161ece 100644 (file)
 #define TRC_HVM_ENTRYEXIT 0x00081000   /* VMENTRY and #VMEXIT       */
 #define TRC_HVM_HANDLER   0x00082000   /* various HVM handlers      */
 
+#define TRC_SCHED_MIN       0x00021000   /* Just runstate changes */
+#define TRC_SCHED_VERBOSE   0x00028000   /* More inclusive scheduling */
+
 /* Trace events per class */
 #define TRC_LOST_RECORDS        (TRC_GEN + 1)
 #define TRC_TRACE_WRAP_BUFFER  (TRC_GEN + 2)
 #define TRC_TRACE_CPU_CHANGE    (TRC_GEN + 3)
 
-#define TRC_SCHED_DOM_ADD       (TRC_SCHED +  1)
-#define TRC_SCHED_DOM_REM       (TRC_SCHED +  2)
-#define TRC_SCHED_SLEEP         (TRC_SCHED +  3)
-#define TRC_SCHED_WAKE          (TRC_SCHED +  4)
-#define TRC_SCHED_YIELD         (TRC_SCHED +  5)
-#define TRC_SCHED_BLOCK         (TRC_SCHED +  6)
-#define TRC_SCHED_SHUTDOWN      (TRC_SCHED +  7)
-#define TRC_SCHED_CTL           (TRC_SCHED +  8)
-#define TRC_SCHED_ADJDOM        (TRC_SCHED +  9)
-#define TRC_SCHED_SWITCH        (TRC_SCHED + 10)
-#define TRC_SCHED_S_TIMER_FN    (TRC_SCHED + 11)
-#define TRC_SCHED_T_TIMER_FN    (TRC_SCHED + 12)
-#define TRC_SCHED_DOM_TIMER_FN  (TRC_SCHED + 13)
-#define TRC_SCHED_SWITCH_INFPREV (TRC_SCHED + 14)
-#define TRC_SCHED_SWITCH_INFNEXT (TRC_SCHED + 15)
+#define TRC_SCHED_RUNSTATE_CHANGE (TRC_SCHED_MIN + 1)
+#define TRC_SCHED_DOM_ADD        (TRC_SCHED_VERBOSE +  1)
+#define TRC_SCHED_DOM_REM        (TRC_SCHED_VERBOSE +  2)
+#define TRC_SCHED_SLEEP          (TRC_SCHED_VERBOSE +  3)
+#define TRC_SCHED_WAKE           (TRC_SCHED_VERBOSE +  4)
+#define TRC_SCHED_YIELD          (TRC_SCHED_VERBOSE +  5)
+#define TRC_SCHED_BLOCK          (TRC_SCHED_VERBOSE +  6)
+#define TRC_SCHED_SHUTDOWN       (TRC_SCHED_VERBOSE +  7)
+#define TRC_SCHED_CTL            (TRC_SCHED_VERBOSE +  8)
+#define TRC_SCHED_ADJDOM         (TRC_SCHED_VERBOSE +  9)
+#define TRC_SCHED_SWITCH         (TRC_SCHED_VERBOSE + 10)
+#define TRC_SCHED_S_TIMER_FN     (TRC_SCHED_VERBOSE + 11)
+#define TRC_SCHED_T_TIMER_FN     (TRC_SCHED_VERBOSE + 12)
+#define TRC_SCHED_DOM_TIMER_FN   (TRC_SCHED_VERBOSE + 13)
+#define TRC_SCHED_SWITCH_INFPREV (TRC_SCHED_VERBOSE + 14)
+#define TRC_SCHED_SWITCH_INFNEXT (TRC_SCHED_VERBOSE + 15)
 
 #define TRC_MEM_PAGE_GRANT_MAP      (TRC_MEM + 1)
 #define TRC_MEM_PAGE_GRANT_UNMAP    (TRC_MEM + 2)