Re: [PATCH v2 1/4] perf record: allocate affinity masks
Hi, On 02.01.2019 0:39, Jiri Olsa wrote: > On Mon, Dec 24, 2018 at 03:23:13PM +0300, Alexey Budankov wrote: > > SNIP > >> @@ -2143,6 +2152,8 @@ int cmd_record(int argc, const char **argv) >> if (verbose > 0) >> pr_info("nr_cblocks: %d\n", rec->opts.nr_cblocks); >> >> +pr_debug("affinity: %s\n", affinity_tags[rec->opts.affinity]); >> + >> err = __cmd_record(, argc, argv); >> out: >> perf_evlist__delete(rec->evlist); >> diff --git a/tools/perf/perf.h b/tools/perf/perf.h >> index 388c6dd128b8..69f54529d81f 100644 >> --- a/tools/perf/perf.h >> +++ b/tools/perf/perf.h >> @@ -83,6 +83,14 @@ struct record_opts { >> clockid_tclockid; >> u64 clockid_res_ns; >> int nr_cblocks; >> +int affinity; >> +}; >> + >> +enum perf_affinity { >> +PERF_AFFINITY_SYS = 0, >> +PERF_AFFINITY_NODE, >> +PERF_AFFINITY_CPU, >> +PERF_AFFINITY_EOF > > PERF_AFFINITY_MAX might be better name Corrected in v3. Thanks, Alexey > > jirka >
Re: [PATCH v2 1/4] perf record: allocate affinity masks
On Mon, Dec 24, 2018 at 03:23:13PM +0300, Alexey Budankov wrote: SNIP > @@ -2143,6 +2152,8 @@ int cmd_record(int argc, const char **argv) > if (verbose > 0) > pr_info("nr_cblocks: %d\n", rec->opts.nr_cblocks); > > + pr_debug("affinity: %s\n", affinity_tags[rec->opts.affinity]); > + > err = __cmd_record(, argc, argv); > out: > perf_evlist__delete(rec->evlist); > diff --git a/tools/perf/perf.h b/tools/perf/perf.h > index 388c6dd128b8..69f54529d81f 100644 > --- a/tools/perf/perf.h > +++ b/tools/perf/perf.h > @@ -83,6 +83,14 @@ struct record_opts { > clockid_tclockid; > u64 clockid_res_ns; > int nr_cblocks; > + int affinity; > +}; > + > +enum perf_affinity { > + PERF_AFFINITY_SYS = 0, > + PERF_AFFINITY_NODE, > + PERF_AFFINITY_CPU, > + PERF_AFFINITY_EOF PERF_AFFINITY_MAX might be better name jirka
[PATCH v2 1/4] perf record: allocate affinity masks
Allocate affinity option and masks for mmap data buffers and record thread as well as initialize allocated objects. Signed-off-by: Alexey Budankov --- Changes in v2: - made debug affinity mode message user friendly - converted affinity mode defines to enum values --- tools/perf/builtin-record.c | 13 - tools/perf/perf.h | 8 tools/perf/util/evlist.c| 6 +++--- tools/perf/util/evlist.h| 2 +- tools/perf/util/mmap.c | 2 ++ tools/perf/util/mmap.h | 3 ++- 6 files changed, 28 insertions(+), 6 deletions(-) diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 882285fb9f64..b26febb54d01 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -81,12 +81,17 @@ struct record { booltimestamp_boundary; struct switch_outputswitch_output; unsigned long long samples; + cpu_set_t affinity_mask; }; static volatile int auxtrace_record__snapshot_started; static DEFINE_TRIGGER(auxtrace_snapshot_trigger); static DEFINE_TRIGGER(switch_output_trigger); +static const char* affinity_tags[PERF_AFFINITY_EOF] = { + "SYS", "NODE", "CPU" +}; + static bool switch_output_signal(struct record *rec) { return rec->switch_output.signal && @@ -533,7 +538,8 @@ static int record__mmap_evlist(struct record *rec, if (perf_evlist__mmap_ex(evlist, opts->mmap_pages, opts->auxtrace_mmap_pages, -opts->auxtrace_snapshot_mode, opts->nr_cblocks) < 0) { +opts->auxtrace_snapshot_mode, +opts->nr_cblocks, opts->affinity) < 0) { if (errno == EPERM) { pr_err("Permission error mapping pages.\n" "Consider increasing " @@ -1980,6 +1986,9 @@ int cmd_record(int argc, const char **argv) # undef REASON #endif + CPU_ZERO(>affinity_mask); + rec->opts.affinity = PERF_AFFINITY_SYS; + rec->evlist = perf_evlist__new(); if (rec->evlist == NULL) return -ENOMEM; @@ -2143,6 +2152,8 @@ int cmd_record(int argc, const char **argv) if (verbose > 0) pr_info("nr_cblocks: %d\n", rec->opts.nr_cblocks); + pr_debug("affinity: %s\n", affinity_tags[rec->opts.affinity]); + err = __cmd_record(, argc, argv); out: perf_evlist__delete(rec->evlist); diff --git a/tools/perf/perf.h b/tools/perf/perf.h index 388c6dd128b8..69f54529d81f 100644 --- a/tools/perf/perf.h +++ b/tools/perf/perf.h @@ -83,6 +83,14 @@ struct record_opts { clockid_tclockid; u64 clockid_res_ns; int nr_cblocks; + int affinity; +}; + +enum perf_affinity { + PERF_AFFINITY_SYS = 0, + PERF_AFFINITY_NODE, + PERF_AFFINITY_CPU, + PERF_AFFINITY_EOF }; struct option; diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index e90575192209..60e825be944a 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c @@ -1018,7 +1018,7 @@ int perf_evlist__parse_mmap_pages(const struct option *opt, const char *str, */ int perf_evlist__mmap_ex(struct perf_evlist *evlist, unsigned int pages, unsigned int auxtrace_pages, -bool auxtrace_overwrite, int nr_cblocks) +bool auxtrace_overwrite, int nr_cblocks, int affinity) { struct perf_evsel *evsel; const struct cpu_map *cpus = evlist->cpus; @@ -1028,7 +1028,7 @@ int perf_evlist__mmap_ex(struct perf_evlist *evlist, unsigned int pages, * Its value is decided by evsel's write_backward. * So should not be passed through const pointer. */ - struct mmap_params mp = { .nr_cblocks = nr_cblocks }; + struct mmap_params mp = { .nr_cblocks = nr_cblocks, .affinity = affinity }; if (!evlist->mmap) evlist->mmap = perf_evlist__alloc_mmap(evlist, false); @@ -1060,7 +1060,7 @@ int perf_evlist__mmap_ex(struct perf_evlist *evlist, unsigned int pages, int perf_evlist__mmap(struct perf_evlist *evlist, unsigned int pages) { - return perf_evlist__mmap_ex(evlist, pages, 0, false, 0); + return perf_evlist__mmap_ex(evlist, pages, 0, false, 0, PERF_AFFINITY_SYS); } int perf_evlist__create_maps(struct perf_evlist *evlist, struct target *target) diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h index 868294491194..72728d7f4432 100644 --- a/tools/perf/util/evlist.h +++ b/tools/perf/util/evlist.h @@ -162,7 +162,7 @@ unsigned long perf_event_mlock_kb_in_pages(void); int perf_evlist__mmap_ex(struct perf_evlist *evlist, unsigned int pages, unsigned int auxtrace_pages, -bool auxtrace_overwrite, int nr_cblocks); +bool auxtrace_overwrite, int nr_cblocks, int
[PATCH v2 1/4] perf record: allocate affinity masks
Allocate affinity option and masks for mmap data buffers and record thread as well as initialize allocated objects. Signed-off-by: Alexey Budankov --- Changes in v2: - made debug affinity mode message user friendly - converted affinity mode defines to enum values --- tools/perf/builtin-record.c | 13 - tools/perf/perf.h | 8 tools/perf/util/evlist.c| 6 +++--- tools/perf/util/evlist.h| 2 +- tools/perf/util/mmap.c | 2 ++ tools/perf/util/mmap.h | 3 ++- 6 files changed, 28 insertions(+), 6 deletions(-) diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 882285fb9f64..b26febb54d01 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -81,12 +81,17 @@ struct record { booltimestamp_boundary; struct switch_outputswitch_output; unsigned long long samples; + cpu_set_t affinity_mask; }; static volatile int auxtrace_record__snapshot_started; static DEFINE_TRIGGER(auxtrace_snapshot_trigger); static DEFINE_TRIGGER(switch_output_trigger); +static const char* affinity_tags[PERF_AFFINITY_EOF] = { + "SYS", "NODE", "CPU" +}; + static bool switch_output_signal(struct record *rec) { return rec->switch_output.signal && @@ -533,7 +538,8 @@ static int record__mmap_evlist(struct record *rec, if (perf_evlist__mmap_ex(evlist, opts->mmap_pages, opts->auxtrace_mmap_pages, -opts->auxtrace_snapshot_mode, opts->nr_cblocks) < 0) { +opts->auxtrace_snapshot_mode, +opts->nr_cblocks, opts->affinity) < 0) { if (errno == EPERM) { pr_err("Permission error mapping pages.\n" "Consider increasing " @@ -1980,6 +1986,9 @@ int cmd_record(int argc, const char **argv) # undef REASON #endif + CPU_ZERO(>affinity_mask); + rec->opts.affinity = PERF_AFFINITY_SYS; + rec->evlist = perf_evlist__new(); if (rec->evlist == NULL) return -ENOMEM; @@ -2143,6 +2152,8 @@ int cmd_record(int argc, const char **argv) if (verbose > 0) pr_info("nr_cblocks: %d\n", rec->opts.nr_cblocks); + pr_debug("affinity: %s\n", affinity_tags[rec->opts.affinity]); + err = __cmd_record(, argc, argv); out: perf_evlist__delete(rec->evlist); diff --git a/tools/perf/perf.h b/tools/perf/perf.h index 388c6dd128b8..69f54529d81f 100644 --- a/tools/perf/perf.h +++ b/tools/perf/perf.h @@ -83,6 +83,14 @@ struct record_opts { clockid_tclockid; u64 clockid_res_ns; int nr_cblocks; + int affinity; +}; + +enum perf_affinity { + PERF_AFFINITY_SYS = 0, + PERF_AFFINITY_NODE, + PERF_AFFINITY_CPU, + PERF_AFFINITY_EOF }; struct option; diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index e90575192209..60e825be944a 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c @@ -1018,7 +1018,7 @@ int perf_evlist__parse_mmap_pages(const struct option *opt, const char *str, */ int perf_evlist__mmap_ex(struct perf_evlist *evlist, unsigned int pages, unsigned int auxtrace_pages, -bool auxtrace_overwrite, int nr_cblocks) +bool auxtrace_overwrite, int nr_cblocks, int affinity) { struct perf_evsel *evsel; const struct cpu_map *cpus = evlist->cpus; @@ -1028,7 +1028,7 @@ int perf_evlist__mmap_ex(struct perf_evlist *evlist, unsigned int pages, * Its value is decided by evsel's write_backward. * So should not be passed through const pointer. */ - struct mmap_params mp = { .nr_cblocks = nr_cblocks }; + struct mmap_params mp = { .nr_cblocks = nr_cblocks, .affinity = affinity }; if (!evlist->mmap) evlist->mmap = perf_evlist__alloc_mmap(evlist, false); @@ -1060,7 +1060,7 @@ int perf_evlist__mmap_ex(struct perf_evlist *evlist, unsigned int pages, int perf_evlist__mmap(struct perf_evlist *evlist, unsigned int pages) { - return perf_evlist__mmap_ex(evlist, pages, 0, false, 0); + return perf_evlist__mmap_ex(evlist, pages, 0, false, 0, PERF_AFFINITY_SYS); } int perf_evlist__create_maps(struct perf_evlist *evlist, struct target *target) diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h index 868294491194..72728d7f4432 100644 --- a/tools/perf/util/evlist.h +++ b/tools/perf/util/evlist.h @@ -162,7 +162,7 @@ unsigned long perf_event_mlock_kb_in_pages(void); int perf_evlist__mmap_ex(struct perf_evlist *evlist, unsigned int pages, unsigned int auxtrace_pages, -bool auxtrace_overwrite, int nr_cblocks); +bool auxtrace_overwrite, int nr_cblocks, int