lkml.org 
[lkml]   [2020]   [Jun]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 bpf-next 1/4] perf: expose get/put_chain_entry()
    Date
    Sanitize and expose get/put_chain_entry(). This would be used by bpf stack
    map.

    Suggested-by: Peter Zijlstra <peterz@infradead.org>
    Signed-off-by: Song Liu <songliubraving@fb.com>
    ---
    include/linux/perf_event.h | 2 ++
    kernel/events/callchain.c | 13 ++++++-------
    2 files changed, 8 insertions(+), 7 deletions(-)

    diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
    index b4bb32082342c..00ab5efa38334 100644
    --- a/include/linux/perf_event.h
    +++ b/include/linux/perf_event.h
    @@ -1244,6 +1244,8 @@ get_perf_callchain(struct pt_regs *regs, u32 init_nr, bool kernel, bool user,
    extern struct perf_callchain_entry *perf_callchain(struct perf_event *event, struct pt_regs *regs);
    extern int get_callchain_buffers(int max_stack);
    extern void put_callchain_buffers(void);
    +extern struct perf_callchain_entry *get_callchain_entry(int *rctx);
    +extern void put_callchain_entry(int rctx);

    extern int sysctl_perf_event_max_stack;
    extern int sysctl_perf_event_max_contexts_per_stack;
    diff --git a/kernel/events/callchain.c b/kernel/events/callchain.c
    index 334d48b16c36d..c6ce894e4ce94 100644
    --- a/kernel/events/callchain.c
    +++ b/kernel/events/callchain.c
    @@ -149,7 +149,7 @@ void put_callchain_buffers(void)
    }
    }

    -static struct perf_callchain_entry *get_callchain_entry(int *rctx)
    +struct perf_callchain_entry *get_callchain_entry(int *rctx)
    {
    int cpu;
    struct callchain_cpus_entries *entries;
    @@ -159,8 +159,10 @@ static struct perf_callchain_entry *get_callchain_entry(int *rctx)
    return NULL;

    entries = rcu_dereference(callchain_cpus_entries);
    - if (!entries)
    + if (!entries) {
    + put_recursion_context(this_cpu_ptr(callchain_recursion), *rctx);
    return NULL;
    + }

    cpu = smp_processor_id();

    @@ -168,7 +170,7 @@ static struct perf_callchain_entry *get_callchain_entry(int *rctx)
    (*rctx * perf_callchain_entry__sizeof()));
    }

    -static void
    +void
    put_callchain_entry(int rctx)
    {
    put_recursion_context(this_cpu_ptr(callchain_recursion), rctx);
    @@ -183,11 +185,8 @@ get_perf_callchain(struct pt_regs *regs, u32 init_nr, bool kernel, bool user,
    int rctx;

    entry = get_callchain_entry(&rctx);
    - if (rctx == -1)
    - return NULL;
    -
    if (!entry)
    - goto exit_put;
    + return NULL;

    ctx.entry = entry;
    ctx.max_stack = max_stack;
    --
    2.24.1
    \
     
     \ /
      Last update: 2020-06-27 02:27    [W:2.538 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site