Re: [PATCH 10/17] perf tools: Enable overwrite settings
From: Arnaldo Carvalho de Melo
Date: Mon May 16 2016 - 09:39:07 EST
Em Fri, May 13, 2016 at 07:56:07AM +0000, Wang Nan escreveu:
> 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.
You forgot to add this to the documentation, please add it when you
respin this patch. If you done so in a separate patch, please yank it
from there and add it here.
- Arnaldo
> Signed-off-by: Wang Nan <wangnan0@xxxxxxxxxx>
> Signed-off-by: He Kuang <hekuang@xxxxxxxxxx>
> Cc: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx>
> Cc: Jiri Olsa <jolsa@xxxxxxxxxx>
> Cc: Masami Hiramatsu <masami.hiramatsu.pt@xxxxxxxxxxx>
> Cc: Namhyung Kim <namhyung@xxxxxxxxxx>
> Cc: Zefan Li <lizefan@xxxxxxxxxx>
> Cc: pi3orama@xxxxxxx
> ---
> tools/perf/builtin-record.c | 1 +
> tools/perf/perf.h | 1 +
> tools/perf/util/evsel.c | 4 ++++
> 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 ++
> 7 files changed, 30 insertions(+), 2 deletions(-)
>
> diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
> index d9a92e0..939aa68 100644
> --- a/tools/perf/builtin-record.c
> +++ b/tools/perf/builtin-record.c
> @@ -1265,6 +1265,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 c35bcfd..386d030 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 a23f547..be4fc25 100644
> --- a/tools/perf/util/evsel.c
> +++ b/tools/perf/util/evsel.c
> @@ -670,6 +670,9 @@ 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;
> }
> @@ -746,6 +749,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