* [PATCH v2 0/4] perf: Support a new 'percore' event qualifier
@ 2019-03-16 16:34 Jin Yao
2019-03-16 16:34 ` [PATCH v2 1/4] perf: Add a " Jin Yao
` (4 more replies)
0 siblings, 5 replies; 8+ messages in thread
From: Jin Yao @ 2019-03-16 16:34 UTC (permalink / raw)
To: acme, jolsa, peterz, mingo, alexander.shishkin
Cc: Linux-kernel, ak, kan.liang, yao.jin, Jin Yao
The 'percore' event qualifier which sums up the event counts for both
hardware threads in a core. For example,
perf stat -e cpu/event=0,umask=0x3,percore=1/,cpu/event=0,umask=0x3/
In this example, we count the event 'ref-cycles' per-core and per-CPU in
one perf stat command-line.
We can already support per-core counting with --per-core, but it's
often useful to do this together with other metrics that are collected
per CPU (per hardware thread). So this patch series supports this
per-core counting on a event level.
v2:
---
1. Change 'coresum' to 'percore'.
2. Move the aggregate counts printing to a seperate patch.
Jin Yao (4):
perf: Add a 'percore' event qualifier
perf stat: Factor out aggregate counts printing
perf stat: Support 'percore' event qualifier
perf test: Add a simple test for term 'percore'
tools/perf/Documentation/perf-stat.txt | 4 ++
tools/perf/builtin-stat.c | 21 +++++++
tools/perf/tests/parse-events.c | 10 ++-
tools/perf/util/evsel.c | 2 +
tools/perf/util/evsel.h | 3 +
tools/perf/util/parse-events.c | 27 +++++++++
tools/perf/util/parse-events.h | 1 +
tools/perf/util/parse-events.l | 1 +
tools/perf/util/stat-display.c | 108 ++++++++++++++++++++++++---------
tools/perf/util/stat.c | 8 ++-
10 files changed, 151 insertions(+), 34 deletions(-)
--
2.7.4
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 1/4] perf: Add a 'percore' event qualifier
2019-03-16 16:34 [PATCH v2 0/4] perf: Support a new 'percore' event qualifier Jin Yao
@ 2019-03-16 16:34 ` Jin Yao
2019-03-18 9:21 ` Jiri Olsa
2019-03-16 16:34 ` [PATCH v2 2/4] perf stat: Factor out aggregate counts printing Jin Yao
` (3 subsequent siblings)
4 siblings, 1 reply; 8+ messages in thread
From: Jin Yao @ 2019-03-16 16:34 UTC (permalink / raw)
To: acme, jolsa, peterz, mingo, alexander.shishkin
Cc: Linux-kernel, ak, kan.liang, yao.jin, Jin Yao
Add a 'percore' event qualifier, like cpu/event=0,umask=0x3,percore=1/,
that sums up the event counts for both hardware threads in a core.
We can already do this with --per-core, but it's often useful to do
this together with other metrics that are collected per hardware thread.
So we need to support this per-core counting on a event level.
This can be implemented in only the user tool, no kernel support needed.
v2:
---
Change the qualifier name from 'coresum' to 'percore' according to
comments from Jiri and Andi.
Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
---
tools/perf/util/evsel.c | 2 ++
tools/perf/util/evsel.h | 3 +++
tools/perf/util/parse-events.c | 27 +++++++++++++++++++++++++++
tools/perf/util/parse-events.h | 1 +
tools/perf/util/parse-events.l | 1 +
5 files changed, 34 insertions(+)
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 3bbf73e..b900157 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -803,6 +803,8 @@ static void apply_config_terms(struct perf_evsel *evsel,
break;
case PERF_EVSEL__CONFIG_TERM_DRV_CFG:
break;
+ case PERF_EVSEL__CONFIG_TERM_PERCORE:
+ break;
default:
break;
}
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index cc578e0..fd86689 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -50,6 +50,7 @@ enum term_type {
PERF_EVSEL__CONFIG_TERM_OVERWRITE,
PERF_EVSEL__CONFIG_TERM_DRV_CFG,
PERF_EVSEL__CONFIG_TERM_BRANCH,
+ PERF_EVSEL__CONFIG_TERM_PERCORE,
};
struct perf_evsel_config_term {
@@ -67,6 +68,7 @@ struct perf_evsel_config_term {
bool overwrite;
char *branch;
unsigned long max_events;
+ bool percore;
} val;
bool weak;
};
@@ -150,6 +152,7 @@ struct perf_evsel {
struct perf_evsel **metric_events;
bool collect_stat;
bool weak_group;
+ bool percore;
const char *pmu_name;
};
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 4dcc01b..e4f2634 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -930,6 +930,7 @@ static const char *config_term_names[__PARSE_EVENTS__TERM_TYPE_NR] = {
[PARSE_EVENTS__TERM_TYPE_OVERWRITE] = "overwrite",
[PARSE_EVENTS__TERM_TYPE_NOOVERWRITE] = "no-overwrite",
[PARSE_EVENTS__TERM_TYPE_DRV_CFG] = "driver-config",
+ [PARSE_EVENTS__TERM_TYPE_PERCORE] = "percore",
};
static bool config_term_shrinked;
@@ -950,6 +951,7 @@ config_term_avail(int term_type, struct parse_events_error *err)
case PARSE_EVENTS__TERM_TYPE_CONFIG2:
case PARSE_EVENTS__TERM_TYPE_NAME:
case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD:
+ case PARSE_EVENTS__TERM_TYPE_PERCORE:
return true;
default:
if (!err)
@@ -1041,6 +1043,14 @@ do { \
case PARSE_EVENTS__TERM_TYPE_MAX_EVENTS:
CHECK_TYPE_VAL(NUM);
break;
+ case PARSE_EVENTS__TERM_TYPE_PERCORE:
+ CHECK_TYPE_VAL(NUM);
+ if ((unsigned int)term->val.num > 1) {
+ err->str = strdup("expected 0 or 1");
+ err->idx = term->err_val;
+ return -EINVAL;
+ }
+ break;
default:
err->str = strdup("unknown term");
err->idx = term->err_term;
@@ -1179,6 +1189,10 @@ do { \
case PARSE_EVENTS__TERM_TYPE_DRV_CFG:
ADD_CONFIG_TERM(DRV_CFG, drv_cfg, term->val.str);
break;
+ case PARSE_EVENTS__TERM_TYPE_PERCORE:
+ ADD_CONFIG_TERM(PERCORE, percore,
+ term->val.num ? 1 : 0);
+ break;
default:
break;
}
@@ -1233,6 +1247,18 @@ int parse_events_add_numeric(struct parse_events_state *parse_state,
get_config_name(head_config), &config_terms);
}
+static bool config_term_percore(struct list_head *config_terms)
+{
+ struct perf_evsel_config_term *term;
+
+ list_for_each_entry(term, config_terms, list) {
+ if (term->type == PERF_EVSEL__CONFIG_TERM_PERCORE)
+ return term->val.percore ? true : false;
+ }
+
+ return false;
+}
+
int parse_events_add_pmu(struct parse_events_state *parse_state,
struct list_head *list, char *name,
struct list_head *head_config,
@@ -1305,6 +1331,7 @@ int parse_events_add_pmu(struct parse_events_state *parse_state,
evsel->metric_name = info.metric_name;
evsel->pmu_name = name;
evsel->use_uncore_alias = use_uncore_alias;
+ evsel->percore = config_term_percore(&evsel->config_terms);
}
return evsel ? 0 : -ENOMEM;
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index 5ed035c..ad4fbf3 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -75,6 +75,7 @@ enum {
PARSE_EVENTS__TERM_TYPE_NOOVERWRITE,
PARSE_EVENTS__TERM_TYPE_OVERWRITE,
PARSE_EVENTS__TERM_TYPE_DRV_CFG,
+ PARSE_EVENTS__TERM_TYPE_PERCORE,
__PARSE_EVENTS__TERM_TYPE_NR,
};
diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l
index 7805c71..7e9f8dc 100644
--- a/tools/perf/util/parse-events.l
+++ b/tools/perf/util/parse-events.l
@@ -274,6 +274,7 @@ 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); }
+percore { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_PERCORE); }
, { return ','; }
"/" { BEGIN(INITIAL); return '/'; }
{name_minus} { return str(yyscanner, PE_NAME); }
--
2.7.4
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v2 2/4] perf stat: Factor out aggregate counts printing
2019-03-16 16:34 [PATCH v2 0/4] perf: Support a new 'percore' event qualifier Jin Yao
2019-03-16 16:34 ` [PATCH v2 1/4] perf: Add a " Jin Yao
@ 2019-03-16 16:34 ` Jin Yao
2019-03-16 16:34 ` [PATCH v2 3/4] perf stat: Support 'percore' event qualifier Jin Yao
` (2 subsequent siblings)
4 siblings, 0 replies; 8+ messages in thread
From: Jin Yao @ 2019-03-16 16:34 UTC (permalink / raw)
To: acme, jolsa, peterz, mingo, alexander.shishkin
Cc: Linux-kernel, ak, kan.liang, yao.jin, Jin Yao
Move the aggregate counts printing to a new function
print_counter_aggrdata, which will be used in following
patches.
v2:
---
Create this patch according to Jiri's comments.
Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
---
tools/perf/util/stat-display.c | 65 +++++++++++++++++++++++++-----------------
1 file changed, 39 insertions(+), 26 deletions(-)
diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c
index 6d043c7..728dc88 100644
--- a/tools/perf/util/stat-display.c
+++ b/tools/perf/util/stat-display.c
@@ -599,6 +599,41 @@ static void aggr_cb(struct perf_stat_config *config,
}
}
+static void print_counter_aggrdata(struct perf_stat_config *config,
+ struct perf_evsel *counter, int s,
+ char *prefix, bool metric_only,
+ bool *first)
+{
+ struct aggr_data ad;
+ FILE *output = config->output;
+ u64 ena, run, val;
+ int id, nr;
+ double uval;
+
+ ad.id = id = config->aggr_map->map[s];
+ ad.val = ad.ena = ad.run = 0;
+ ad.nr = 0;
+ if (!collect_data(config, counter, aggr_cb, &ad))
+ return;
+
+ nr = ad.nr;
+ ena = ad.ena;
+ run = ad.run;
+ val = ad.val;
+ if (*first && metric_only) {
+ *first = false;
+ aggr_printout(config, counter, id, nr);
+ }
+ if (prefix && !metric_only)
+ fprintf(output, "%s", prefix);
+
+ uval = val * counter->scale;
+ printout(config, id, nr, counter, uval, prefix,
+ run, ena, 1.0, &rt_stat);
+ if (!metric_only)
+ fputc('\n', output);
+}
+
static void print_aggr(struct perf_stat_config *config,
struct perf_evlist *evlist,
char *prefix)
@@ -606,9 +641,7 @@ static void print_aggr(struct perf_stat_config *config,
bool metric_only = config->metric_only;
FILE *output = config->output;
struct perf_evsel *counter;
- int s, id, nr;
- double uval;
- u64 ena, run, val;
+ int s;
bool first;
if (!(config->aggr_map || config->aggr_get_id))
@@ -621,36 +654,16 @@ static void print_aggr(struct perf_stat_config *config,
* Without each counter has its own line.
*/
for (s = 0; s < config->aggr_map->nr; s++) {
- struct aggr_data ad;
if (prefix && metric_only)
fprintf(output, "%s", prefix);
- ad.id = id = config->aggr_map->map[s];
first = true;
evlist__for_each_entry(evlist, counter) {
if (is_duration_time(counter))
continue;
-
- ad.val = ad.ena = ad.run = 0;
- ad.nr = 0;
- if (!collect_data(config, counter, aggr_cb, &ad))
- continue;
- nr = ad.nr;
- ena = ad.ena;
- run = ad.run;
- val = ad.val;
- if (first && metric_only) {
- first = false;
- aggr_printout(config, counter, id, nr);
- }
- if (prefix && !metric_only)
- fprintf(output, "%s", prefix);
-
- uval = val * counter->scale;
- printout(config, id, nr, counter, uval, prefix,
- run, ena, 1.0, &rt_stat);
- if (!metric_only)
- fputc('\n', output);
+ print_counter_aggrdata(config, counter, s,
+ prefix, metric_only,
+ &first);
}
if (metric_only)
fputc('\n', output);
--
2.7.4
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v2 3/4] perf stat: Support 'percore' event qualifier
2019-03-16 16:34 [PATCH v2 0/4] perf: Support a new 'percore' event qualifier Jin Yao
2019-03-16 16:34 ` [PATCH v2 1/4] perf: Add a " Jin Yao
2019-03-16 16:34 ` [PATCH v2 2/4] perf stat: Factor out aggregate counts printing Jin Yao
@ 2019-03-16 16:34 ` Jin Yao
2019-03-16 16:34 ` [PATCH v2 4/4] perf test: Add a simple test for term 'percore' Jin Yao
2019-03-18 9:21 ` [PATCH v2 0/4] perf: Support a new 'percore' event qualifier Jiri Olsa
4 siblings, 0 replies; 8+ messages in thread
From: Jin Yao @ 2019-03-16 16:34 UTC (permalink / raw)
To: acme, jolsa, peterz, mingo, alexander.shishkin
Cc: Linux-kernel, ak, kan.liang, yao.jin, Jin Yao
With this patch, we can use the 'percore' event qualifier in perf-stat.
root@skl:/tmp# perf stat -e cpu/event=0,umask=0x3,percore=1/,cpu/event=0,umask=0x3/ -a -A -I1000
1.000773050 S0-C0 98,352,832 cpu/event=0,umask=0x3,percore=1/ (50.01%)
1.000773050 S0-C1 103,763,057 cpu/event=0,umask=0x3,percore=1/ (50.02%)
1.000773050 S0-C2 196,776,995 cpu/event=0,umask=0x3,percore=1/ (50.02%)
1.000773050 S0-C3 176,493,779 cpu/event=0,umask=0x3,percore=1/ (50.02%)
1.000773050 CPU0 47,699,641 cpu/event=0,umask=0x3/ (50.02%)
1.000773050 CPU1 49,052,451 cpu/event=0,umask=0x3/ (49.98%)
1.000773050 CPU2 102,771,422 cpu/event=0,umask=0x3/ (49.98%)
1.000773050 CPU3 100,784,662 cpu/event=0,umask=0x3/ (49.98%)
1.000773050 CPU4 43,171,342 cpu/event=0,umask=0x3/ (49.98%)
1.000773050 CPU5 54,152,158 cpu/event=0,umask=0x3/ (49.98%)
1.000773050 CPU6 93,618,410 cpu/event=0,umask=0x3/ (49.98%)
1.000773050 CPU7 74,477,589 cpu/event=0,umask=0x3/ (49.99%)
In this example, we count the event 'ref-cycles' per-core and per-CPU in
one perf stat command-line. From the output, we can see:
S0-C0 = CPU0 + CPU4
S0-C1 = CPU1 + CPU5
S0-C2 = CPU2 + CPU6
S0-C3 = CPU3 + CPU7
So the result is expected (tiny difference is ignored).
Note that, the 'percore' event qualifier needs to use with option '-A'.
v2:
---
Change 'coresum' to 'percore'.
Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
---
tools/perf/Documentation/perf-stat.txt | 4 ++++
tools/perf/builtin-stat.c | 21 +++++++++++++++++
tools/perf/util/stat-display.c | 43 ++++++++++++++++++++++++++++++----
tools/perf/util/stat.c | 8 ++++---
4 files changed, 69 insertions(+), 7 deletions(-)
diff --git a/tools/perf/Documentation/perf-stat.txt b/tools/perf/Documentation/perf-stat.txt
index 4bc2085..614d2c5 100644
--- a/tools/perf/Documentation/perf-stat.txt
+++ b/tools/perf/Documentation/perf-stat.txt
@@ -43,6 +43,10 @@ report::
param1 and param2 are defined as formats for the PMU in
/sys/bus/event_source/devices/<pmu>/format/*
+ 'percore' is a event qualifier that sums up the event counts for both
+ hardware threads in a core. For example:
+ perf stat -A -a -e cpu/event,percore=1/,otherevent ...
+
- a symbolically formed event like 'pmu/config=M,config1=N,config2=K/'
where M, N, K are numbers (in decimal, hex, octal format).
Acceptable values for each of 'config', 'config1' and 'config2'
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index 7b8f09b..af2ce87 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -832,6 +832,18 @@ static int perf_stat__get_core_cached(struct perf_stat_config *config,
return perf_stat__get_aggr(config, perf_stat__get_core, map, idx);
}
+static bool term_percore_set(void)
+{
+ struct perf_evsel *counter;
+
+ evlist__for_each_entry(evsel_list, counter) {
+ if (counter->percore)
+ return true;
+ }
+
+ return false;
+}
+
static int perf_stat_init_aggr_mode(void)
{
int nr;
@@ -852,6 +864,15 @@ static int perf_stat_init_aggr_mode(void)
stat_config.aggr_get_id = perf_stat__get_core_cached;
break;
case AGGR_NONE:
+ if (term_percore_set()) {
+ if (cpu_map__build_core_map(evsel_list->cpus,
+ &stat_config.aggr_map)) {
+ perror("cannot build core map");
+ return -1;
+ }
+ stat_config.aggr_get_id = perf_stat__get_core_cached;
+ }
+ break;
case AGGR_GLOBAL:
case AGGR_THREAD:
case AGGR_UNSET:
diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c
index 728dc88..477da62 100644
--- a/tools/perf/util/stat-display.c
+++ b/tools/perf/util/stat-display.c
@@ -93,9 +93,17 @@ static void aggr_printout(struct perf_stat_config *config,
config->csv_sep);
break;
case AGGR_NONE:
- fprintf(config->output, "CPU%*d%s",
- config->csv_output ? 0 : -4,
- perf_evsel__cpus(evsel)->map[id], config->csv_sep);
+ if (evsel->percore) {
+ fprintf(config->output, "S%d-C%*d%s",
+ cpu_map__id_to_socket(id),
+ config->csv_output ? 0 : -5,
+ cpu_map__id_to_cpu(id), config->csv_sep);
+ } else {
+ fprintf(config->output, "CPU%*d%s ",
+ config->csv_output ? 0 : -5,
+ perf_evsel__cpus(evsel)->map[id],
+ config->csv_sep);
+ }
break;
case AGGR_THREAD:
fprintf(config->output, "%*s-%*d%s",
@@ -1114,6 +1122,30 @@ static void print_footer(struct perf_stat_config *config)
"the same PMU. Try reorganizing the group.\n");
}
+static void print_percore(struct perf_stat_config *config,
+ struct perf_evsel *counter, char *prefix)
+{
+ bool metric_only = config->metric_only;
+ FILE *output = config->output;
+ int s;
+ bool first = true;
+
+ if (!(config->aggr_map || config->aggr_get_id))
+ return;
+
+ for (s = 0; s < config->aggr_map->nr; s++) {
+ if (prefix && metric_only)
+ fprintf(output, "%s", prefix);
+
+ print_counter_aggrdata(config, counter, s,
+ prefix, metric_only,
+ &first);
+ }
+
+ if (metric_only)
+ fputc('\n', output);
+}
+
void
perf_evlist__print_counters(struct perf_evlist *evlist,
struct perf_stat_config *config,
@@ -1170,7 +1202,10 @@ perf_evlist__print_counters(struct perf_evlist *evlist,
evlist__for_each_entry(evlist, counter) {
if (is_duration_time(counter))
continue;
- print_counter(config, counter, prefix);
+ if (counter->percore)
+ print_percore(config, counter, prefix);
+ else
+ print_counter(config, counter, prefix);
}
}
break;
diff --git a/tools/perf/util/stat.c b/tools/perf/util/stat.c
index 4d40515..1e2da2b 100644
--- a/tools/perf/util/stat.c
+++ b/tools/perf/util/stat.c
@@ -277,9 +277,11 @@ process_counter_values(struct perf_stat_config *config, struct perf_evsel *evsel
if (!evsel->snapshot)
perf_evsel__compute_deltas(evsel, cpu, thread, count);
perf_counts_values__scale(count, config->scale, NULL);
- if (config->aggr_mode == AGGR_NONE)
- perf_stat__update_shadow_stats(evsel, count->val, cpu,
- &rt_stat);
+ if ((config->aggr_mode == AGGR_NONE) && (!evsel->percore)) {
+ perf_stat__update_shadow_stats(evsel, count->val,
+ cpu, &rt_stat);
+ }
+
if (config->aggr_mode == AGGR_THREAD) {
if (config->stats)
perf_stat__update_shadow_stats(evsel,
--
2.7.4
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v2 4/4] perf test: Add a simple test for term 'percore'
2019-03-16 16:34 [PATCH v2 0/4] perf: Support a new 'percore' event qualifier Jin Yao
` (2 preceding siblings ...)
2019-03-16 16:34 ` [PATCH v2 3/4] perf stat: Support 'percore' event qualifier Jin Yao
@ 2019-03-16 16:34 ` Jin Yao
2019-03-18 9:21 ` [PATCH v2 0/4] perf: Support a new 'percore' event qualifier Jiri Olsa
4 siblings, 0 replies; 8+ messages in thread
From: Jin Yao @ 2019-03-16 16:34 UTC (permalink / raw)
To: acme, jolsa, peterz, mingo, alexander.shishkin
Cc: Linux-kernel, ak, kan.liang, yao.jin, Jin Yao
It's a simple test which just checks if parser works.
v2:
---
Change 'coresum' to 'percore'
Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
---
tools/perf/tests/parse-events.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c
index 4a69c07..e59a7bb 100644
--- a/tools/perf/tests/parse-events.c
+++ b/tools/perf/tests/parse-events.c
@@ -605,6 +605,14 @@ static int test__checkterms_simple(struct list_head *terms)
TEST_ASSERT_VAL("wrong val", term->val.num == 1);
TEST_ASSERT_VAL("wrong config", !strcmp(term->config, "umask"));
+ /* percore=1*/
+ term = list_entry(term->list.next, struct parse_events_term, list);
+ TEST_ASSERT_VAL("wrong type term",
+ term->type_term == PARSE_EVENTS__TERM_TYPE_PERCORE);
+ TEST_ASSERT_VAL("wrong type val",
+ term->type_val == PARSE_EVENTS__TERM_TYPE_NUM);
+ TEST_ASSERT_VAL("wrong val", term->val.num == 1);
+
return 0;
}
@@ -1734,7 +1742,7 @@ struct terms_test {
static struct terms_test test__terms[] = {
[0] = {
- .str = "config=10,config1,config2=3,umask=1",
+ .str = "config=10,config1,config2=3,umask=1,percore=1",
.check = test__checkterms_simple,
},
};
--
2.7.4
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/4] perf: Add a 'percore' event qualifier
2019-03-16 16:34 ` [PATCH v2 1/4] perf: Add a " Jin Yao
@ 2019-03-18 9:21 ` Jiri Olsa
2019-03-19 1:08 ` Jin, Yao
0 siblings, 1 reply; 8+ messages in thread
From: Jiri Olsa @ 2019-03-18 9:21 UTC (permalink / raw)
To: Jin Yao
Cc: acme, jolsa, peterz, mingo, alexander.shishkin, Linux-kernel, ak,
kan.liang, yao.jin
On Sun, Mar 17, 2019 at 12:34:25AM +0800, Jin Yao wrote:
SNIP
> static bool config_term_shrinked;
> @@ -950,6 +951,7 @@ config_term_avail(int term_type, struct parse_events_error *err)
> case PARSE_EVENTS__TERM_TYPE_CONFIG2:
> case PARSE_EVENTS__TERM_TYPE_NAME:
> case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD:
> + case PARSE_EVENTS__TERM_TYPE_PERCORE:
> return true;
> default:
> if (!err)
> @@ -1041,6 +1043,14 @@ do { \
> case PARSE_EVENTS__TERM_TYPE_MAX_EVENTS:
> CHECK_TYPE_VAL(NUM);
> break;
> + case PARSE_EVENTS__TERM_TYPE_PERCORE:
> + CHECK_TYPE_VAL(NUM);
> + if ((unsigned int)term->val.num > 1) {
> + err->str = strdup("expected 0 or 1");
> + err->idx = term->err_val;
> + return -EINVAL;
> + }
> + break;
> default:
> err->str = strdup("unknown term");
> err->idx = term->err_term;
> @@ -1179,6 +1189,10 @@ do { \
> case PARSE_EVENTS__TERM_TYPE_DRV_CFG:
> ADD_CONFIG_TERM(DRV_CFG, drv_cfg, term->val.str);
> break;
> + case PARSE_EVENTS__TERM_TYPE_PERCORE:
> + ADD_CONFIG_TERM(PERCORE, percore,
> + term->val.num ? 1 : 0);
term->val.num ? true : false
> + break;
> default:
> break;
> }
> @@ -1233,6 +1247,18 @@ int parse_events_add_numeric(struct parse_events_state *parse_state,
> get_config_name(head_config), &config_terms);
> }
>
> +static bool config_term_percore(struct list_head *config_terms)
> +{
> + struct perf_evsel_config_term *term;
> +
> + list_for_each_entry(term, config_terms, list) {
> + if (term->type == PERF_EVSEL__CONFIG_TERM_PERCORE)
> + return term->val.percore ? true : false;
term->val.percore is bool right? so just simple
return term->val.percore;
should be enough.. together with above change
jirka
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 0/4] perf: Support a new 'percore' event qualifier
2019-03-16 16:34 [PATCH v2 0/4] perf: Support a new 'percore' event qualifier Jin Yao
` (3 preceding siblings ...)
2019-03-16 16:34 ` [PATCH v2 4/4] perf test: Add a simple test for term 'percore' Jin Yao
@ 2019-03-18 9:21 ` Jiri Olsa
4 siblings, 0 replies; 8+ messages in thread
From: Jiri Olsa @ 2019-03-18 9:21 UTC (permalink / raw)
To: Jin Yao
Cc: acme, jolsa, peterz, mingo, alexander.shishkin, Linux-kernel, ak,
kan.liang, yao.jin
On Sun, Mar 17, 2019 at 12:34:24AM +0800, Jin Yao wrote:
> The 'percore' event qualifier which sums up the event counts for both
> hardware threads in a core. For example,
>
> perf stat -e cpu/event=0,umask=0x3,percore=1/,cpu/event=0,umask=0x3/
>
> In this example, we count the event 'ref-cycles' per-core and per-CPU in
> one perf stat command-line.
>
> We can already support per-core counting with --per-core, but it's
> often useful to do this together with other metrics that are collected
> per CPU (per hardware thread). So this patch series supports this
> per-core counting on a event level.
>
> v2:
> ---
> 1. Change 'coresum' to 'percore'.
> 2. Move the aggregate counts printing to a seperate patch.
other than the nit for patch 1, it all looks ok to me
Acked-by: Jiri Olsa <jolsa@kernel.org>
thanks,
jirka
>
> Jin Yao (4):
> perf: Add a 'percore' event qualifier
> perf stat: Factor out aggregate counts printing
> perf stat: Support 'percore' event qualifier
> perf test: Add a simple test for term 'percore'
>
> tools/perf/Documentation/perf-stat.txt | 4 ++
> tools/perf/builtin-stat.c | 21 +++++++
> tools/perf/tests/parse-events.c | 10 ++-
> tools/perf/util/evsel.c | 2 +
> tools/perf/util/evsel.h | 3 +
> tools/perf/util/parse-events.c | 27 +++++++++
> tools/perf/util/parse-events.h | 1 +
> tools/perf/util/parse-events.l | 1 +
> tools/perf/util/stat-display.c | 108 ++++++++++++++++++++++++---------
> tools/perf/util/stat.c | 8 ++-
> 10 files changed, 151 insertions(+), 34 deletions(-)
>
> --
> 2.7.4
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2 1/4] perf: Add a 'percore' event qualifier
2019-03-18 9:21 ` Jiri Olsa
@ 2019-03-19 1:08 ` Jin, Yao
0 siblings, 0 replies; 8+ messages in thread
From: Jin, Yao @ 2019-03-19 1:08 UTC (permalink / raw)
To: Jiri Olsa
Cc: acme, jolsa, peterz, mingo, alexander.shishkin, Linux-kernel, ak,
kan.liang, yao.jin
On 3/18/2019 5:21 PM, Jiri Olsa wrote:
> On Sun, Mar 17, 2019 at 12:34:25AM +0800, Jin Yao wrote:
>
> SNIP
>
>> static bool config_term_shrinked;
>> @@ -950,6 +951,7 @@ config_term_avail(int term_type, struct parse_events_error *err)
>> case PARSE_EVENTS__TERM_TYPE_CONFIG2:
>> case PARSE_EVENTS__TERM_TYPE_NAME:
>> case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD:
>> + case PARSE_EVENTS__TERM_TYPE_PERCORE:
>> return true;
>> default:
>> if (!err)
>> @@ -1041,6 +1043,14 @@ do { \
>> case PARSE_EVENTS__TERM_TYPE_MAX_EVENTS:
>> CHECK_TYPE_VAL(NUM);
>> break;
>> + case PARSE_EVENTS__TERM_TYPE_PERCORE:
>> + CHECK_TYPE_VAL(NUM);
>> + if ((unsigned int)term->val.num > 1) {
>> + err->str = strdup("expected 0 or 1");
>> + err->idx = term->err_val;
>> + return -EINVAL;
>> + }
>> + break;
>> default:
>> err->str = strdup("unknown term");
>> err->idx = term->err_term;
>> @@ -1179,6 +1189,10 @@ do { \
>> case PARSE_EVENTS__TERM_TYPE_DRV_CFG:
>> ADD_CONFIG_TERM(DRV_CFG, drv_cfg, term->val.str);
>> break;
>> + case PARSE_EVENTS__TERM_TYPE_PERCORE:
>> + ADD_CONFIG_TERM(PERCORE, percore,
>> + term->val.num ? 1 : 0);
>
> term->val.num ? true : false
>
>> + break;
>> default:
>> break;
>> }
>> @@ -1233,6 +1247,18 @@ int parse_events_add_numeric(struct parse_events_state *parse_state,
>> get_config_name(head_config), &config_terms);
>> }
>>
>> +static bool config_term_percore(struct list_head *config_terms)
>> +{
>> + struct perf_evsel_config_term *term;
>> +
>> + list_for_each_entry(term, config_terms, list) {
>> + if (term->type == PERF_EVSEL__CONFIG_TERM_PERCORE)
>> + return term->val.percore ? true : false;
>
> term->val.percore is bool right? so just simple
> return term->val.percore;
>
> should be enough.. together with above change
>
> jirka
>
Thanks Jiri, I add this change in v3.
Thanks
Jin Yao
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2019-03-19 1:08 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-03-16 16:34 [PATCH v2 0/4] perf: Support a new 'percore' event qualifier Jin Yao
2019-03-16 16:34 ` [PATCH v2 1/4] perf: Add a " Jin Yao
2019-03-18 9:21 ` Jiri Olsa
2019-03-19 1:08 ` Jin, Yao
2019-03-16 16:34 ` [PATCH v2 2/4] perf stat: Factor out aggregate counts printing Jin Yao
2019-03-16 16:34 ` [PATCH v2 3/4] perf stat: Support 'percore' event qualifier Jin Yao
2019-03-16 16:34 ` [PATCH v2 4/4] perf test: Add a simple test for term 'percore' Jin Yao
2019-03-18 9:21 ` [PATCH v2 0/4] perf: Support a new 'percore' event qualifier Jiri Olsa
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.