lkml.org 
[lkml]   [2020]   [Aug]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v8 04/18] perf ftrace: add option '-m/--buffer-size' to set per-cpu buffer size
    Date
    This adds an option '-m/--buffer-size' to allow us set the size of per-cpu
    tracing buffer.

    Signed-off-by: Changbin Du <changbin.du@gmail.com>

    ---
    v2: support units as a suffix.
    ---
    tools/perf/Documentation/perf-ftrace.txt | 5 +++
    tools/perf/builtin-ftrace.c | 55 ++++++++++++++++++++++++
    2 files changed, 60 insertions(+)

    diff --git a/tools/perf/Documentation/perf-ftrace.txt b/tools/perf/Documentation/perf-ftrace.txt
    index 4f5628445a63..7a5d915f60b0 100644
    --- a/tools/perf/Documentation/perf-ftrace.txt
    +++ b/tools/perf/Documentation/perf-ftrace.txt
    @@ -53,6 +53,11 @@ OPTIONS
    Ranges of CPUs are specified with -: 0-2.
    Default is to trace on all online CPUs.

    +-m::
    +--buffer-size::
    + Set the size of per-cpu tracing buffer, <size> is expected to
    + be a number with appended unit character - B/K/M/G.
    +
    -T::
    --trace-funcs=::
    Select function tracer and set function filter on the given
    diff --git a/tools/perf/builtin-ftrace.c b/tools/perf/builtin-ftrace.c
    index 4b3fcee5725a..a3a4f4be9dde 100644
    --- a/tools/perf/builtin-ftrace.c
    +++ b/tools/perf/builtin-ftrace.c
    @@ -26,6 +26,7 @@
    #include "thread_map.h"
    #include "util/cap.h"
    #include "util/config.h"
    +#include "util/units.h"

    #define DEFAULT_TRACER "function_graph"

    @@ -39,6 +40,7 @@ struct perf_ftrace {
    struct list_head graph_funcs;
    struct list_head nograph_funcs;
    int graph_depth;
    + unsigned long percpu_buffer_size;
    };

    struct filter_entry {
    @@ -324,6 +326,21 @@ static int set_tracing_depth(struct perf_ftrace *ftrace)
    return 0;
    }

    +static int set_tracing_percpu_buffer_size(struct perf_ftrace *ftrace)
    +{
    + int ret;
    +
    + if (ftrace->percpu_buffer_size == 0)
    + return 0;
    +
    + ret = write_tracing_file_int("buffer_size_kb",
    + ftrace->percpu_buffer_size / 1024);
    + if (ret < 0)
    + return ret;
    +
    + return 0;
    +}
    +
    static int __cmd_ftrace(struct perf_ftrace *ftrace, int argc, const char **argv)
    {
    char *trace_file;
    @@ -388,6 +405,11 @@ static int __cmd_ftrace(struct perf_ftrace *ftrace, int argc, const char **argv)
    goto out_reset;
    }

    + if (set_tracing_percpu_buffer_size(ftrace) < 0) {
    + pr_err("failed to set tracing per-cpu buffer size\n");
    + goto out_reset;
    + }
    +
    if (write_tracing_file("current_tracer", ftrace->tracer) < 0) {
    pr_err("failed to set current_tracer to %s\n", ftrace->tracer);
    goto out_reset;
    @@ -506,6 +528,37 @@ static void delete_filter_func(struct list_head *head)
    }
    }

    +static int parse_buffer_size(const struct option *opt,
    + const char *str, int unset)
    +{
    + unsigned long *s = (unsigned long *)opt->value;
    + static struct parse_tag tags_size[] = {
    + { .tag = 'B', .mult = 1 },
    + { .tag = 'K', .mult = 1 << 10 },
    + { .tag = 'M', .mult = 1 << 20 },
    + { .tag = 'G', .mult = 1 << 30 },
    + { .tag = 0 },
    + };
    + unsigned long val;
    +
    + if (unset) {
    + *s = 0;
    + return 0;
    + }
    +
    + val = parse_tag_value(str, tags_size);
    + if (val != (unsigned long) -1) {
    + if (val < 1024) {
    + pr_err("buffer size too small, must larger than 1KB.");
    + return -1;
    + }
    + *s = val;
    + return 0;
    + }
    +
    + return -1;
    +}
    +
    static void select_tracer(struct perf_ftrace *ftrace)
    {
    bool graph = !list_empty(&ftrace->graph_funcs) ||
    @@ -560,6 +613,8 @@ int cmd_ftrace(int argc, const char **argv)
    "Set nograph filter on given functions", parse_filter_func),
    OPT_INTEGER('D', "graph-depth", &ftrace.graph_depth,
    "Max depth for function graph tracer"),
    + OPT_CALLBACK('m', "buffer-size", &ftrace.percpu_buffer_size, "size",
    + "size of per cpu buffer", parse_buffer_size),
    OPT_END()
    };

    --
    2.25.1
    \
     
     \ /
      Last update: 2020-08-08 04:33    [W:2.976 / U:0.228 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site