lkml.org 
[lkml]   [2016]   [May]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 07/11] perf tools: Enable overwrite settings
    Date
    This patch allows following config terms and option:

    Globally setting events to overwrite;

    # perf record --overwrite ...

    Set specific events to be overwrite or no-overwrite.

    # perf record --event cycles/overwrite/ ...
    # perf record --event cycles/no-overwrite/ ...

    Add missing config terms and update config term array size because the
    longest string length is changed.

    For overwritable events, automatically select attr.write_backward since
    perf requires it to be backward for reading.

    Signed-off-by: Wang Nan <wangnan0@huawei.com>
    Signed-off-by: He Kuang <hekuang@huawei.com>
    Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Zefan Li <lizefan@huawei.com>
    Cc: pi3orama@163.com
    ---
    tools/perf/Documentation/perf-record.txt | 14 ++++++++++++++
    tools/perf/builtin-record.c | 1 +
    tools/perf/perf.h | 1 +
    tools/perf/util/evsel.c | 12 ++++++++++++
    tools/perf/util/evsel.h | 2 ++
    tools/perf/util/parse-events.c | 20 ++++++++++++++++++--
    tools/perf/util/parse-events.h | 2 ++
    tools/perf/util/parse-events.l | 2 ++
    8 files changed, 52 insertions(+), 2 deletions(-)

    diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Documentation/perf-record.txt
    index 8dbee83..f5cb932 100644
    --- a/tools/perf/Documentation/perf-record.txt
    +++ b/tools/perf/Documentation/perf-record.txt
    @@ -360,6 +360,20 @@ particular perf.data snapshot should be kept or not.

    Implies --timestamp-filename, --no-buildid and --no-buildid-cache.

    +--overwrite::
    +Makes all events use overwritable ring buffer. Event with overwritable ring
    +buffer works like a flight recorder: when buffer gets full, instead of dumping
    +records into output file, kernel overwrites old records silently. Perf dumps
    +data from overwritable ring buffer when switching output (see --switch-output)
    +and before terminate.
    +
    +Perf behaves like a daemon when '--overwrite' and '--switch-output' are
    +provided. It record and drop events in background, and dumps data when
    +something unusual is detected.
    +
    +'overwrite' attribute can also be set or canceled for specific event using
    +config terms like 'cycles/overwrite/' and 'instructions/no-overwrite/'.
    +
    SEE ALSO
    --------
    linkperf:perf-stat[1], linkperf:perf-list[1]
    diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
    index d4cf1b0..9611380 100644
    --- a/tools/perf/builtin-record.c
    +++ b/tools/perf/builtin-record.c
    @@ -1310,6 +1310,7 @@ struct option __record_options[] = {
    OPT_BOOLEAN_SET('i', "no-inherit", &record.opts.no_inherit,
    &record.opts.no_inherit_set,
    "child tasks do not inherit counters"),
    + OPT_BOOLEAN(0, "overwrite", &record.opts.overwrite, "use overwrite mode"),
    OPT_UINTEGER('F', "freq", &record.opts.user_freq, "profile at this frequency"),
    OPT_CALLBACK('m', "mmap-pages", &record.opts, "pages[,pages]",
    "number of mmap data pages and AUX area tracing mmap pages",
    diff --git a/tools/perf/perf.h b/tools/perf/perf.h
    index cd8f1b1..608b42b 100644
    --- a/tools/perf/perf.h
    +++ b/tools/perf/perf.h
    @@ -59,6 +59,7 @@ struct record_opts {
    bool record_switch_events;
    bool all_kernel;
    bool all_user;
    + bool overwrite;
    unsigned int freq;
    unsigned int mmap_pages;
    unsigned int auxtrace_mmap_pages;
    diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
    index 02c177d..6330a4f 100644
    --- a/tools/perf/util/evsel.c
    +++ b/tools/perf/util/evsel.c
    @@ -671,11 +671,22 @@ static void apply_config_terms(struct perf_evsel *evsel,
    */
    attr->inherit = term->val.inherit ? 1 : 0;
    break;
    + case PERF_EVSEL__CONFIG_TERM_OVERWRITE:
    + evsel->overwrite = term->val.overwrite ? 1 : 0;
    + break;
    default:
    break;
    }
    }

    + /*
    + * Set backward after config term processing because it is
    + * possible to set overwrite globally, without config
    + * terms.
    + */
    + if (evsel->overwrite)
    + attr->write_backward = 1;
    +
    /* User explicitly set per-event callgraph, clear the old setting and reset. */
    if ((callgraph_buf != NULL) || (dump_size > 0)) {

    @@ -747,6 +758,7 @@ void perf_evsel__config(struct perf_evsel *evsel, struct record_opts *opts,

    attr->sample_id_all = perf_missing_features.sample_id_all ? 0 : 1;
    attr->inherit = !opts->no_inherit;
    + evsel->overwrite = opts->overwrite;

    perf_evsel__set_sample_bit(evsel, IP);
    perf_evsel__set_sample_bit(evsel, TID);
    diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
    index c1f1015..bce99fa 100644
    --- a/tools/perf/util/evsel.h
    +++ b/tools/perf/util/evsel.h
    @@ -44,6 +44,7 @@ enum {
    PERF_EVSEL__CONFIG_TERM_CALLGRAPH,
    PERF_EVSEL__CONFIG_TERM_STACK_USER,
    PERF_EVSEL__CONFIG_TERM_INHERIT,
    + PERF_EVSEL__CONFIG_TERM_OVERWRITE,
    PERF_EVSEL__CONFIG_TERM_MAX,
    };

    @@ -57,6 +58,7 @@ struct perf_evsel_config_term {
    char *callgraph;
    u64 stack_user;
    bool inherit;
    + bool overwrite;
    } val;
    };

    diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
    index bcbc983..85f813d 100644
    --- a/tools/perf/util/parse-events.c
    +++ b/tools/perf/util/parse-events.c
    @@ -900,6 +900,8 @@ static const char *config_term_names[__PARSE_EVENTS__TERM_TYPE_NR] = {
    [PARSE_EVENTS__TERM_TYPE_STACKSIZE] = "stack-size",
    [PARSE_EVENTS__TERM_TYPE_NOINHERIT] = "no-inherit",
    [PARSE_EVENTS__TERM_TYPE_INHERIT] = "inherit",
    + [PARSE_EVENTS__TERM_TYPE_OVERWRITE] = "overwrite",
    + [PARSE_EVENTS__TERM_TYPE_NOOVERWRITE] = "no-overwrite",
    };

    static bool config_term_shrinked;
    @@ -992,6 +994,12 @@ do { \
    case PARSE_EVENTS__TERM_TYPE_NOINHERIT:
    CHECK_TYPE_VAL(NUM);
    break;
    + case PARSE_EVENTS__TERM_TYPE_OVERWRITE:
    + CHECK_TYPE_VAL(NUM);
    + break;
    + case PARSE_EVENTS__TERM_TYPE_NOOVERWRITE:
    + CHECK_TYPE_VAL(NUM);
    + break;
    case PARSE_EVENTS__TERM_TYPE_NAME:
    CHECK_TYPE_VAL(STR);
    break;
    @@ -1040,6 +1048,8 @@ static int config_term_tracepoint(struct perf_event_attr *attr,
    case PARSE_EVENTS__TERM_TYPE_STACKSIZE:
    case PARSE_EVENTS__TERM_TYPE_INHERIT:
    case PARSE_EVENTS__TERM_TYPE_NOINHERIT:
    + case PARSE_EVENTS__TERM_TYPE_OVERWRITE:
    + case PARSE_EVENTS__TERM_TYPE_NOOVERWRITE:
    return config_term_common(attr, term, err);
    default:
    if (err) {
    @@ -1109,6 +1119,12 @@ do { \
    case PARSE_EVENTS__TERM_TYPE_NOINHERIT:
    ADD_CONFIG_TERM(INHERIT, inherit, term->val.num ? 0 : 1);
    break;
    + case PARSE_EVENTS__TERM_TYPE_OVERWRITE:
    + ADD_CONFIG_TERM(OVERWRITE, overwrite, term->val.num ? 1 : 0);
    + break;
    + case PARSE_EVENTS__TERM_TYPE_NOOVERWRITE:
    + ADD_CONFIG_TERM(OVERWRITE, overwrite, term->val.num ? 0 : 1);
    + break;
    default:
    break;
    }
    @@ -2322,9 +2338,9 @@ static void config_terms_list(char *buf, size_t buf_sz)
    char *parse_events_formats_error_string(char *additional_terms)
    {
    char *str;
    - /* "branch_type" is the longest name */
    + /* "no-overwrite" is the longest name */
    char static_terms[__PARSE_EVENTS__TERM_TYPE_NR *
    - (sizeof("branch_type") - 1)];
    + (sizeof("no-overwrite") - 1)];

    config_terms_list(static_terms, sizeof(static_terms));
    /* valid terms */
    diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
    index d740c3c..f341d9d 100644
    --- a/tools/perf/util/parse-events.h
    +++ b/tools/perf/util/parse-events.h
    @@ -68,6 +68,8 @@ enum {
    PARSE_EVENTS__TERM_TYPE_STACKSIZE,
    PARSE_EVENTS__TERM_TYPE_NOINHERIT,
    PARSE_EVENTS__TERM_TYPE_INHERIT,
    + PARSE_EVENTS__TERM_TYPE_NOOVERWRITE,
    + PARSE_EVENTS__TERM_TYPE_OVERWRITE,
    __PARSE_EVENTS__TERM_TYPE_NR,
    };

    diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l
    index 1477fbc..cc4c426 100644
    --- a/tools/perf/util/parse-events.l
    +++ b/tools/perf/util/parse-events.l
    @@ -201,6 +201,8 @@ call-graph { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CALLGRAPH); }
    stack-size { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_STACKSIZE); }
    inherit { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_INHERIT); }
    no-inherit { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_NOINHERIT); }
    +overwrite { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_OVERWRITE); }
    +no-overwrite { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_NOOVERWRITE); }
    , { return ','; }
    "/" { BEGIN(INITIAL); return '/'; }
    {name_minus} { return str(yyscanner, PE_NAME); }
    --
    1.8.3.4
    \
     
     \ /
      Last update: 2016-05-23 09:41    [W:4.099 / U:0.132 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site