diff options
author | Alexander Shishkin <alexander.shishkin@linux.intel.com> | 2015-01-14 07:18:15 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2015-04-02 11:14:12 -0400 |
commit | 68db7e98c3a6ebe7284b6cf14906ed7c55f3f7f0 (patch) | |
tree | aff39ee8c8f8703e262768397610c5949fd93f48 /kernel/events | |
parent | bed5b25ad9c8a2f5d735ef0bc746ec870c01c1b0 (diff) |
perf: Add AUX record
When there's new data in the AUX space, output a record indicating its
offset and size and a set of flags, such as PERF_AUX_FLAG_TRUNCATED, to
mean the described data was truncated to fit in the ring buffer.
Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Arnaldo Carvalho de Melo <acme@infradead.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Kaixu Xia <kaixu.xia@linaro.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Robert Richter <rric@kernel.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: adrian.hunter@intel.com
Cc: kan.liang@intel.com
Cc: markus.t.metzger@intel.com
Cc: mathieu.poirier@linaro.org
Link: http://lkml.kernel.org/r/1421237903-181015-7-git-send-email-alexander.shishkin@linux.intel.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'kernel/events')
-rw-r--r-- | kernel/events/core.c | 34 | ||||
-rw-r--r-- | kernel/events/internal.h | 3 |
2 files changed, 37 insertions, 0 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c index 6d9fdaef7b57..dbc2eff32230 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
@@ -5916,6 +5916,40 @@ void perf_event_mmap(struct vm_area_struct *vma) | |||
5916 | perf_event_mmap_event(&mmap_event); | 5916 | perf_event_mmap_event(&mmap_event); |
5917 | } | 5917 | } |
5918 | 5918 | ||
5919 | void perf_event_aux_event(struct perf_event *event, unsigned long head, | ||
5920 | unsigned long size, u64 flags) | ||
5921 | { | ||
5922 | struct perf_output_handle handle; | ||
5923 | struct perf_sample_data sample; | ||
5924 | struct perf_aux_event { | ||
5925 | struct perf_event_header header; | ||
5926 | u64 offset; | ||
5927 | u64 size; | ||
5928 | u64 flags; | ||
5929 | } rec = { | ||
5930 | .header = { | ||
5931 | .type = PERF_RECORD_AUX, | ||
5932 | .misc = 0, | ||
5933 | .size = sizeof(rec), | ||
5934 | }, | ||
5935 | .offset = head, | ||
5936 | .size = size, | ||
5937 | .flags = flags, | ||
5938 | }; | ||
5939 | int ret; | ||
5940 | |||
5941 | perf_event_header__init_id(&rec.header, &sample, event); | ||
5942 | ret = perf_output_begin(&handle, event, rec.header.size); | ||
5943 | |||
5944 | if (ret) | ||
5945 | return; | ||
5946 | |||
5947 | perf_output_put(&handle, rec); | ||
5948 | perf_event__output_id_sample(event, &handle, &sample); | ||
5949 | |||
5950 | perf_output_end(&handle); | ||
5951 | } | ||
5952 | |||
5919 | /* | 5953 | /* |
5920 | * IRQ throttle logging | 5954 | * IRQ throttle logging |
5921 | */ | 5955 | */ |
diff --git a/kernel/events/internal.h b/kernel/events/internal.h index 0f6d08015927..4d117a981431 100644 --- a/kernel/events/internal.h +++ b/kernel/events/internal.h | |||
@@ -62,6 +62,9 @@ static inline bool rb_has_aux(struct ring_buffer *rb) | |||
62 | return !!rb->aux_nr_pages; | 62 | return !!rb->aux_nr_pages; |
63 | } | 63 | } |
64 | 64 | ||
65 | void perf_event_aux_event(struct perf_event *event, unsigned long head, | ||
66 | unsigned long size, u64 flags); | ||
67 | |||
65 | extern void | 68 | extern void |
66 | perf_event_header__init_id(struct perf_event_header *header, | 69 | perf_event_header__init_id(struct perf_event_header *header, |
67 | struct perf_sample_data *data, | 70 | struct perf_sample_data *data, |