Commit 5685e0ff45f5df67e79e9b052b6ffd501ff38c11

Authored by Jiri Olsa
Committed by Arnaldo Carvalho de Melo
1 parent 91d7753a45

perf: Add perf_output_skip function to skip bytes in sample

Introducing perf_output_skip function to be able to skip data within the
perf ring buffer.

When writing data into perf ring buffer we first reserve needed place in
ring buffer and then copy the actual data.

There's a possibility we won't be able to fill all the reserved size
with data, so we need a way to skip the remaining bytes.

This is going to be useful when storing the user stack dump, where we
might end up with less data than we originally requested.

Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Acked-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: "Frank Ch. Eigler" <fche@redhat.com>
Cc: Arun Sharma <asharma@fb.com>
Cc: Benjamin Redelings <benjamin.redelings@nescent.org>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Cyrill Gorcunov <gorcunov@openvz.org>
Cc: Frank Ch. Eigler <fche@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Robert Richter <robert.richter@amd.com>
Cc: Stephane Eranian <eranian@google.com>
Cc: Tom Zanussi <tzanussi@gmail.com>
Cc: Ulrich Drepper <drepper@gmail.com>
Link: http://lkml.kernel.org/r/1344345647-11536-5-git-send-email-jolsa@redhat.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

Showing 3 changed files with 12 additions and 0 deletions Side-by-side Diff

include/linux/perf_event.h
... ... @@ -1321,6 +1321,8 @@
1321 1321 extern void perf_output_end(struct perf_output_handle *handle);
1322 1322 extern unsigned int perf_output_copy(struct perf_output_handle *handle,
1323 1323 const void *buf, unsigned int len);
  1324 +extern unsigned int perf_output_skip(struct perf_output_handle *handle,
  1325 + unsigned int len);
1324 1326 extern int perf_swevent_get_recursion_context(void);
1325 1327 extern void perf_swevent_put_recursion_context(int rctx);
1326 1328 extern void perf_event_enable(struct perf_event *event);
kernel/events/internal.h
... ... @@ -114,6 +114,10 @@
114 114  
115 115 DEFINE_OUTPUT_COPY(__output_copy, memcpy_common)
116 116  
  117 +#define MEMCPY_SKIP(dst, src, n) (n)
  118 +
  119 +DEFINE_OUTPUT_COPY(__output_skip, MEMCPY_SKIP)
  120 +
117 121 #ifndef arch_perf_out_copy_user
118 122 #define arch_perf_out_copy_user __copy_from_user_inatomic
119 123 #endif
kernel/events/ring_buffer.c
... ... @@ -188,6 +188,12 @@
188 188 return __output_copy(handle, buf, len);
189 189 }
190 190  
  191 +unsigned int perf_output_skip(struct perf_output_handle *handle,
  192 + unsigned int len)
  193 +{
  194 + return __output_skip(handle, NULL, len);
  195 +}
  196 +
191 197 void perf_output_end(struct perf_output_handle *handle)
192 198 {
193 199 perf_output_put_handle(handle);