xentrace 2/7: Lost-records record includes currently running vcpu,
authorKeir Fraser <keir.fraser@citrix.com>
Mon, 8 Sep 2008 14:50:33 +0000 (15:50 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Mon, 8 Sep 2008 14:50:33 +0000 (15:50 +0100)
and tsc of first lost record.

Including the current vcpu helps us identify who's currently
running on each processor, even if we've lost records.  The tsc of the
first lost record helps us identify how much time we've spent lost,
and also when a pcpu started experiencing lost records.

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

index 6275f10e27c9d0fa0164360e6b49a7433d1ea4ed..3a0b25cc29c7f644a8f750e68211a2a3c19f599e 100644 (file)
@@ -58,6 +58,7 @@ static int t_buf_highwater;
 
 /* Number of records lost due to per-CPU trace buffer being full. */
 static DEFINE_PER_CPU(unsigned long, lost_records);
+static DEFINE_PER_CPU(unsigned long, lost_records_first_tsc);
 
 /* a flag recording whether initialization has been done */
 /* or more properly, if the tbuf subsystem is enabled right now */
@@ -354,22 +355,27 @@ static inline int insert_wrap_record(struct t_buf *buf, int size)
                     NULL);
 }
 
-#define LOST_REC_SIZE 8
+#define LOST_REC_SIZE (4 + 8 + 16) /* header + tsc + sizeof(struct ed) */
 
 static inline int insert_lost_records(struct t_buf *buf)
 {
     struct {
         u32 lost_records;
-    } ed;
+        u32 did:16, vid:16;
+        u64 first_tsc;
+    } __attribute__((packed)) ed;
 
+    ed.vid = current->vcpu_id;
+    ed.did = current->domain->domain_id;
     ed.lost_records = this_cpu(lost_records);
+    ed.first_tsc = this_cpu(lost_records_first_tsc);
 
     this_cpu(lost_records) = 0;
 
     return __insert_record(buf,
                            TRC_LOST_RECORDS,
                            sizeof(ed),
-                           0 /* !cycles */,
+                           1 /* cycles */,
                            LOST_REC_SIZE,
                            (unsigned char *)&ed);
 }
@@ -479,7 +485,8 @@ void __trace_var(u32 event, int cycles, int extra, unsigned char *extra_data)
     /* Do we have enough space for everything? */
     if ( total_size > bytes_to_tail )
     {
-        this_cpu(lost_records)++;
+        if ( ++this_cpu(lost_records) == 1 )
+            this_cpu(lost_records_first_tsc)=(u64)get_cycles();
         local_irq_restore(flags);
         return;
     }