perf_counter: PERF_RECORD_TIME
authorPeter Zijlstra <a.p.zijlstra@chello.nl>
Mon, 6 Apr 2009 09:45:06 +0000 (11:45 +0200)
committerIngo Molnar <mingo@elte.hu>
Tue, 7 Apr 2009 08:48:57 +0000 (10:48 +0200)
By popular request, provide means to log a timestamp along with the
counter overflow event.

Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
LKML-Reference: <20090406094518.024173282@chello.nl>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
include/linux/perf_counter.h
kernel/perf_counter.c

index ca2d4df29e0c8bbf62179ba15ae70273788486f8..928a7fae0961f8e1e6068b86df486098c3e85750 100644 (file)
@@ -102,6 +102,7 @@ enum perf_counter_record_format {
        PERF_RECORD_TID         = 1U << 1,
        PERF_RECORD_GROUP       = 1U << 2,
        PERF_RECORD_CALLCHAIN   = 1U << 3,
+       PERF_RECORD_TIME        = 1U << 4,
 };
 
 /*
@@ -221,6 +222,7 @@ enum perf_event_type {
        __PERF_EVENT_TID                = PERF_RECORD_TID,
        __PERF_EVENT_GROUP              = PERF_RECORD_GROUP,
        __PERF_EVENT_CALLCHAIN          = PERF_RECORD_CALLCHAIN,
+       __PERF_EVENT_TIME               = PERF_RECORD_TIME,
 };
 
 #ifdef __KERNEL__
index c841563de0433d9dd17f066456796f35f0eca482..19990d1f021547066ef1e09f89d921f90d088cdb 100644 (file)
@@ -1826,6 +1826,7 @@ static void perf_counter_output(struct perf_counter *counter,
        } group_entry;
        struct perf_callchain_entry *callchain = NULL;
        int callchain_size = 0;
+       u64 time;
 
        header.type = PERF_EVENT_COUNTER_OVERFLOW;
        header.size = sizeof(header);
@@ -1862,6 +1863,16 @@ static void perf_counter_output(struct perf_counter *counter,
                }
        }
 
+       if (record_type & PERF_RECORD_TIME) {
+               /*
+                * Maybe do better on x86 and provide cpu_clock_nmi()
+                */
+               time = sched_clock();
+
+               header.type |= __PERF_EVENT_TIME;
+               header.size += sizeof(u64);
+       }
+
        ret = perf_output_begin(&handle, counter, header.size, nmi);
        if (ret)
                return;
@@ -1895,6 +1906,9 @@ static void perf_counter_output(struct perf_counter *counter,
        if (callchain)
                perf_output_copy(&handle, callchain, callchain_size);
 
+       if (record_type & PERF_RECORD_TIME)
+               perf_output_put(&handle, time);
+
        perf_output_end(&handle);
 }