diff options
author | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2009-04-06 05:45:06 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-04-07 04:48:57 -0400 |
commit | 339f7c90b8a2f3aa2dd4267e79f797999e8a3c59 (patch) | |
tree | 9eaf2ff2b0d1dc66f753c74c99160a892d72a76e /kernel/perf_counter.c | |
parent | ebb3c4c4cb81d64cc041356915ec015e2c57092a (diff) |
perf_counter: PERF_RECORD_TIME
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>
Diffstat (limited to 'kernel/perf_counter.c')
-rw-r--r-- | kernel/perf_counter.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/kernel/perf_counter.c b/kernel/perf_counter.c index c841563de04..19990d1f021 100644 --- a/kernel/perf_counter.c +++ b/kernel/perf_counter.c | |||
@@ -1826,6 +1826,7 @@ static void perf_counter_output(struct perf_counter *counter, | |||
1826 | } group_entry; | 1826 | } group_entry; |
1827 | struct perf_callchain_entry *callchain = NULL; | 1827 | struct perf_callchain_entry *callchain = NULL; |
1828 | int callchain_size = 0; | 1828 | int callchain_size = 0; |
1829 | u64 time; | ||
1829 | 1830 | ||
1830 | header.type = PERF_EVENT_COUNTER_OVERFLOW; | 1831 | header.type = PERF_EVENT_COUNTER_OVERFLOW; |
1831 | header.size = sizeof(header); | 1832 | header.size = sizeof(header); |
@@ -1862,6 +1863,16 @@ static void perf_counter_output(struct perf_counter *counter, | |||
1862 | } | 1863 | } |
1863 | } | 1864 | } |
1864 | 1865 | ||
1866 | if (record_type & PERF_RECORD_TIME) { | ||
1867 | /* | ||
1868 | * Maybe do better on x86 and provide cpu_clock_nmi() | ||
1869 | */ | ||
1870 | time = sched_clock(); | ||
1871 | |||
1872 | header.type |= __PERF_EVENT_TIME; | ||
1873 | header.size += sizeof(u64); | ||
1874 | } | ||
1875 | |||
1865 | ret = perf_output_begin(&handle, counter, header.size, nmi); | 1876 | ret = perf_output_begin(&handle, counter, header.size, nmi); |
1866 | if (ret) | 1877 | if (ret) |
1867 | return; | 1878 | return; |
@@ -1895,6 +1906,9 @@ static void perf_counter_output(struct perf_counter *counter, | |||
1895 | if (callchain) | 1906 | if (callchain) |
1896 | perf_output_copy(&handle, callchain, callchain_size); | 1907 | perf_output_copy(&handle, callchain, callchain_size); |
1897 | 1908 | ||
1909 | if (record_type & PERF_RECORD_TIME) | ||
1910 | perf_output_put(&handle, time); | ||
1911 | |||
1898 | perf_output_end(&handle); | 1912 | perf_output_end(&handle); |
1899 | } | 1913 | } |
1900 | 1914 | ||