lkml.org 
[lkml]   [2012]   [Jun]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 06/23] perf: Add perf_output_skip function to skip bytes in sample
    Date
    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 usefull 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>
    ---
    include/linux/perf_event.h | 2 ++
    kernel/events/internal.h | 4 ++++
    kernel/events/ring_buffer.c | 6 ++++++
    3 files changed, 12 insertions(+), 0 deletions(-)

    diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
    index cd40669..024a822 100644
    --- a/include/linux/perf_event.h
    +++ b/include/linux/perf_event.h
    @@ -1303,6 +1303,8 @@ extern int perf_output_begin(struct perf_output_handle *handle,
    extern void perf_output_end(struct perf_output_handle *handle);
    extern unsigned int perf_output_copy(struct perf_output_handle *handle,
    const void *buf, unsigned int len);
    +extern unsigned int perf_output_skip(struct perf_output_handle *handle,
    + unsigned int len);
    extern int perf_swevent_get_recursion_context(void);
    extern void perf_swevent_put_recursion_context(int rctx);
    extern void perf_event_enable(struct perf_event *event);
    diff --git a/kernel/events/internal.h b/kernel/events/internal.h
    index 2206a0f..be1ef29 100644
    --- a/kernel/events/internal.h
    +++ b/kernel/events/internal.h
    @@ -114,6 +114,10 @@ static inline int memcpy_common(void *dst, const void *src, size_t n)

    DEFINE_OUTPUT_COPY(__output_copy, memcpy_common)

    +#define MEMCPY_SKIP(dst, src, n) (n)
    +
    +DEFINE_OUTPUT_COPY(__output_skip, MEMCPY_SKIP)
    +
    #ifndef arch_perf_out_copy_user
    #define arch_perf_out_copy_user __copy_from_user_inatomic
    #endif
    diff --git a/kernel/events/ring_buffer.c b/kernel/events/ring_buffer.c
    index b4c2ad3..23cb34f 100644
    --- a/kernel/events/ring_buffer.c
    +++ b/kernel/events/ring_buffer.c
    @@ -188,6 +188,12 @@ unsigned int perf_output_copy(struct perf_output_handle *handle,
    return __output_copy(handle, buf, len);
    }

    +unsigned int perf_output_skip(struct perf_output_handle *handle,
    + unsigned int len)
    +{
    + return __output_skip(handle, NULL, len);
    +}
    +
    void perf_output_end(struct perf_output_handle *handle)
    {
    perf_output_put_handle(handle);
    --
    1.7.7.6


    \
     
     \ /
      Last update: 2012-06-19 18:41    [W:4.228 / U:0.732 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site