* [PATCH v8 0/5] powerpc/perf: Add json file support for hv_24x7 core level events @ 2020-09-06 11:19 Kajol Jain 2020-09-06 11:20 ` [PATCH v8 1/5] perf/jevents: Remove jevents.h file Kajol Jain ` (4 more replies) 0 siblings, 5 replies; 8+ messages in thread From: Kajol Jain @ 2020-09-06 11:19 UTC (permalink / raw) To: acme Cc: peterz, mingo, mark.rutland, alexander.shishkin, pc, jolsa, namhyung, ak, yao.jin, linux-kernel, linux-perf-users, irogers, maddy, ravi.bangoria, john.garry, kjain Patchset enhance current runtime parameter support. It introduces new fields like "PerChip" and "PerCore" similar to the field "PerPkg" which is used to specify perpkg events. The "PerCore" and "PerChip" specifies whether its core or chip events. Based on which we can decide which runtime parameter user want to access. Now character '?' can refers different parameter based on user requirement. Initially, every time we want to add new terms like chip, core, thread etc, we need to create corrsponding fields in pmu_events and event struct. This patchset adds an enum called 'aggr_mode_class' which store all these aggregation like perchip/percore. It also adds new field 'AggregationMode' to capture these terms. Now, if user wants to add any new term, they just need to add it in the enum defined. This patchset also adds changes of adding new structure called 'json_event' inside jevents.c file to improve the callback prototype inside jevent file. Initially, whenever user want to add new field, they need to update in all function callback which makes it more and more complex with increased number of parmeters. With this change, we just need to add it in new structure 'json_event'. link to the RFC patch: https://lkml.org/lkml/2020/8/25/217 Changelog: v7 -> v8 - Change commit typo from jevents.h to jevents.c - Make json_events function static in first patch. v6 -> v7 - Remove min and get_cpu_str functions from jevents.c - Make json_events function static to solve warning part [John Garry]. - Add event attribute in json_events function to remove strcpy from real_event function, as suggested by Jiri Olsa. - Add warning while checking aggr_mode value [Jiri Olsa]. Kajol Jain (5): perf/jevents: Remove jevents.h file perf/jevents: Add new structure to pass json fields. perf jevents: Add support for parsing perchip/percore events perf/tools: Pass pmu_event structure as a parameter for arch_get_runtimeparam perf/tools/pmu_events/powerpc: Add hv_24x7 core level metric events tools/perf/arch/powerpc/util/header.c | 7 +- .../arch/powerpc/power9/nest_metrics.json | 35 ++- tools/perf/pmu-events/jevents.c | 234 +++++++++--------- tools/perf/pmu-events/jevents.h | 23 -- tools/perf/pmu-events/pmu-events.h | 6 + tools/perf/util/metricgroup.c | 5 +- tools/perf/util/metricgroup.h | 3 +- 7 files changed, 154 insertions(+), 159 deletions(-) delete mode 100644 tools/perf/pmu-events/jevents.h -- 2.26.2 ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v8 1/5] perf/jevents: Remove jevents.h file 2020-09-06 11:19 [PATCH v8 0/5] powerpc/perf: Add json file support for hv_24x7 core level events Kajol Jain @ 2020-09-06 11:20 ` Kajol Jain 2020-09-06 11:20 ` [PATCH v8 2/5] perf/jevents: Add new structure to pass json fields Kajol Jain ` (3 subsequent siblings) 4 siblings, 0 replies; 8+ messages in thread From: Kajol Jain @ 2020-09-06 11:20 UTC (permalink / raw) To: acme Cc: peterz, mingo, mark.rutland, alexander.shishkin, pc, jolsa, namhyung, ak, yao.jin, linux-kernel, linux-perf-users, irogers, maddy, ravi.bangoria, john.garry, kjain This patch removes jevents.h file. Signed-off-by: Kajol Jain <kjain@linux.ibm.com> Reviewed-by: John Garry <john.garry@huawei.com> --- tools/perf/pmu-events/jevents.c | 3 +-- tools/perf/pmu-events/jevents.h | 23 ----------------------- 2 files changed, 1 insertion(+), 25 deletions(-) delete mode 100644 tools/perf/pmu-events/jevents.h diff --git a/tools/perf/pmu-events/jevents.c b/tools/perf/pmu-events/jevents.c index fa86c5f997cc..1b1c3606f62e 100644 --- a/tools/perf/pmu-events/jevents.c +++ b/tools/perf/pmu-events/jevents.c @@ -48,7 +48,6 @@ #include <linux/list.h> #include "jsmn.h" #include "json.h" -#include "jevents.h" int verbose; char *prog; @@ -512,7 +511,7 @@ try_fixup(const char *fn, char *arch_std, char **event, char **desc, } /* Call func with each event in the json file */ -int json_events(const char *fn, +static int json_events(const char *fn, int (*func)(void *data, char *name, char *event, char *desc, char *long_desc, char *pmu, char *unit, char *perpkg, diff --git a/tools/perf/pmu-events/jevents.h b/tools/perf/pmu-events/jevents.h deleted file mode 100644 index 2afc8304529e..000000000000 --- a/tools/perf/pmu-events/jevents.h +++ /dev/null @@ -1,23 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef JEVENTS_H -#define JEVENTS_H 1 - -int json_events(const char *fn, - int (*func)(void *data, char *name, char *event, char *desc, - char *long_desc, - char *pmu, - char *unit, char *perpkg, char *metric_expr, - char *metric_name, char *metric_group, - char *deprecated, char *metric_constraint), - void *data); -char *get_cpu_str(void); - -#ifndef min -#define min(x, y) ({ \ - typeof(x) _min1 = (x); \ - typeof(y) _min2 = (y); \ - (void) (&_min1 == &_min2); \ - _min1 < _min2 ? _min1 : _min2; }) -#endif - -#endif -- 2.26.2 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v8 2/5] perf/jevents: Add new structure to pass json fields. 2020-09-06 11:19 [PATCH v8 0/5] powerpc/perf: Add json file support for hv_24x7 core level events Kajol Jain 2020-09-06 11:20 ` [PATCH v8 1/5] perf/jevents: Remove jevents.h file Kajol Jain @ 2020-09-06 11:20 ` Kajol Jain 2020-09-06 11:20 ` [PATCH v8 3/5] perf jevents: Add support for parsing perchip/percore events Kajol Jain ` (2 subsequent siblings) 4 siblings, 0 replies; 8+ messages in thread From: Kajol Jain @ 2020-09-06 11:20 UTC (permalink / raw) To: acme Cc: peterz, mingo, mark.rutland, alexander.shishkin, pc, jolsa, namhyung, ak, yao.jin, linux-kernel, linux-perf-users, irogers, maddy, ravi.bangoria, john.garry, kjain This patch adds new structure called 'json_event' inside jevents.c file to improve the callback prototype inside jevent files. Initially, whenever user want to add new field, they need to update in all function callback which make it more and more complex with increased number of parmeters. With this change, we just need to add it in new structure 'json_event'. Signed-off-by: Kajol Jain <kjain@linux.ibm.com> Reviewed-by: Andi Kleen <ak@linux.intel.com> Reviewed-by: John Garry <john.garry@huawei.com> --- tools/perf/pmu-events/jevents.c | 212 +++++++++++++++----------------- 1 file changed, 97 insertions(+), 115 deletions(-) diff --git a/tools/perf/pmu-events/jevents.c b/tools/perf/pmu-events/jevents.c index 1b1c3606f62e..388dd287d736 100644 --- a/tools/perf/pmu-events/jevents.c +++ b/tools/perf/pmu-events/jevents.c @@ -52,6 +52,23 @@ int verbose; char *prog; +struct json_event { + char *name; + char *event; + char *desc; + char *long_desc; + char *pmu; + char *unit; + char *perpkg; + char *metric_expr; + char *metric_name; + char *metric_group; + char *deprecated; + char *metric_constraint; +}; + +typedef int (*func)(void *data, struct json_event *je); + int eprintf(int level, int var, const char *fmt, ...) { @@ -70,11 +87,6 @@ int eprintf(int level, int var, const char *fmt, ...) return ret; } -__attribute__((weak)) char *get_cpu_str(void) -{ - return NULL; -} - static void addfield(char *map, char **dst, const char *sep, const char *a, jsmntok_t *bt) { @@ -317,12 +329,7 @@ static void print_events_table_prefix(FILE *fp, const char *tblname) close_table = 1; } -static int print_events_table_entry(void *data, char *name, char *event, - char *desc, char *long_desc, - char *pmu, char *unit, char *perpkg, - char *metric_expr, - char *metric_name, char *metric_group, - char *deprecated, char *metric_constraint) +static int print_events_table_entry(void *data, struct json_event *je) { struct perf_entry_data *pd = data; FILE *outfp = pd->outfp; @@ -334,30 +341,30 @@ static int print_events_table_entry(void *data, char *name, char *event, */ fprintf(outfp, "{\n"); - if (name) - fprintf(outfp, "\t.name = \"%s\",\n", name); - if (event) - fprintf(outfp, "\t.event = \"%s\",\n", event); - fprintf(outfp, "\t.desc = \"%s\",\n", desc); + if (je->name) + fprintf(outfp, "\t.name = \"%s\",\n", je->name); + if (je->event) + fprintf(outfp, "\t.event = \"%s\",\n", je->event); + fprintf(outfp, "\t.desc = \"%s\",\n", je->desc); fprintf(outfp, "\t.topic = \"%s\",\n", topic); - if (long_desc && long_desc[0]) - fprintf(outfp, "\t.long_desc = \"%s\",\n", long_desc); - if (pmu) - fprintf(outfp, "\t.pmu = \"%s\",\n", pmu); - if (unit) - fprintf(outfp, "\t.unit = \"%s\",\n", unit); - if (perpkg) - fprintf(outfp, "\t.perpkg = \"%s\",\n", perpkg); - if (metric_expr) - fprintf(outfp, "\t.metric_expr = \"%s\",\n", metric_expr); - if (metric_name) - fprintf(outfp, "\t.metric_name = \"%s\",\n", metric_name); - if (metric_group) - fprintf(outfp, "\t.metric_group = \"%s\",\n", metric_group); - if (deprecated) - fprintf(outfp, "\t.deprecated = \"%s\",\n", deprecated); - if (metric_constraint) - fprintf(outfp, "\t.metric_constraint = \"%s\",\n", metric_constraint); + if (je->long_desc && je->long_desc[0]) + fprintf(outfp, "\t.long_desc = \"%s\",\n", je->long_desc); + if (je->pmu) + fprintf(outfp, "\t.pmu = \"%s\",\n", je->pmu); + if (je->unit) + fprintf(outfp, "\t.unit = \"%s\",\n", je->unit); + if (je->perpkg) + fprintf(outfp, "\t.perpkg = \"%s\",\n", je->perpkg); + if (je->metric_expr) + fprintf(outfp, "\t.metric_expr = \"%s\",\n", je->metric_expr); + if (je->metric_name) + fprintf(outfp, "\t.metric_name = \"%s\",\n", je->metric_name); + if (je->metric_group) + fprintf(outfp, "\t.metric_group = \"%s\",\n", je->metric_group); + if (je->deprecated) + fprintf(outfp, "\t.deprecated = \"%s\",\n", je->deprecated); + if (je->metric_constraint) + fprintf(outfp, "\t.metric_constraint = \"%s\",\n", je->metric_constraint); fprintf(outfp, "},\n"); return 0; @@ -379,17 +386,17 @@ struct event_struct { char *metric_constraint; }; -#define ADD_EVENT_FIELD(field) do { if (field) { \ - es->field = strdup(field); \ +#define ADD_EVENT_FIELD(field) do { if (je->field) { \ + es->field = strdup(je->field); \ if (!es->field) \ goto out_free; \ } } while (0) #define FREE_EVENT_FIELD(field) free(es->field) -#define TRY_FIXUP_FIELD(field) do { if (es->field && !*field) {\ - *field = strdup(es->field); \ - if (!*field) \ +#define TRY_FIXUP_FIELD(field) do { if (es->field && !je->field) {\ + je->field = strdup(es->field); \ + if (!je->field) \ return -ENOMEM; \ } } while (0) @@ -420,11 +427,7 @@ static void free_arch_std_events(void) } } -static int save_arch_std_events(void *data, char *name, char *event, - char *desc, char *long_desc, char *pmu, - char *unit, char *perpkg, char *metric_expr, - char *metric_name, char *metric_group, - char *deprecated, char *metric_constraint) +static int save_arch_std_events(void *data, struct json_event *je) { struct event_struct *es; @@ -484,11 +487,8 @@ static char *real_event(const char *name, char *event) } static int -try_fixup(const char *fn, char *arch_std, char **event, char **desc, - char **name, char **long_desc, char **pmu, char **filter, - char **perpkg, char **unit, char **metric_expr, char **metric_name, - char **metric_group, unsigned long long eventcode, - char **deprecated, char **metric_constraint) +try_fixup(const char *fn, char *arch_std, unsigned long long eventcode, + struct json_event *je) { /* try to find matching event from arch standard values */ struct event_struct *es; @@ -497,8 +497,8 @@ try_fixup(const char *fn, char *arch_std, char **event, char **desc, if (!strcmp(arch_std, es->name)) { if (!eventcode && es->event) { /* allow EventCode to be overridden */ - free(*event); - *event = NULL; + free(je->event); + je->event = NULL; } FOR_ALL_EVENT_STRUCT_FIELDS(TRY_FIXUP_FIELD); return 0; @@ -512,13 +512,8 @@ try_fixup(const char *fn, char *arch_std, char **event, char **desc, /* Call func with each event in the json file */ static int json_events(const char *fn, - int (*func)(void *data, char *name, char *event, char *desc, - char *long_desc, - char *pmu, char *unit, char *perpkg, - char *metric_expr, - char *metric_name, char *metric_group, - char *deprecated, char *metric_constraint), - void *data) + int (*func)(void *data, struct json_event *je), + void *data) { int err; size_t size; @@ -536,18 +531,10 @@ static int json_events(const char *fn, EXPECT(tokens->type == JSMN_ARRAY, tokens, "expected top level array"); tok = tokens + 1; for (i = 0; i < tokens->size; i++) { - char *event = NULL, *desc = NULL, *name = NULL; - char *long_desc = NULL; + char *event = NULL; char *extra_desc = NULL; - char *pmu = NULL; char *filter = NULL; - char *perpkg = NULL; - char *unit = NULL; - char *metric_expr = NULL; - char *metric_name = NULL; - char *metric_group = NULL; - char *deprecated = NULL; - char *metric_constraint = NULL; + struct json_event je = {}; char *arch_std = NULL; unsigned long long eventcode = 0; struct msrmap *msr = NULL; @@ -582,14 +569,14 @@ static int json_events(const char *fn, eventcode |= strtoul(code, NULL, 0) << 21; free(code); } else if (json_streq(map, field, "EventName")) { - addfield(map, &name, "", "", val); + addfield(map, &je.name, "", "", val); } else if (json_streq(map, field, "BriefDescription")) { - addfield(map, &desc, "", "", val); - fixdesc(desc); + addfield(map, &je.desc, "", "", val); + fixdesc(je.desc); } else if (json_streq(map, field, "PublicDescription")) { - addfield(map, &long_desc, "", "", val); - fixdesc(long_desc); + addfield(map, &je.long_desc, "", "", val); + fixdesc(je.long_desc); } else if (json_streq(map, field, "PEBS") && nz) { precise = val; } else if (json_streq(map, field, "MSRIndex") && nz) { @@ -609,34 +596,34 @@ static int json_events(const char *fn, ppmu = field_to_perf(unit_to_pmu, map, val); if (ppmu) { - pmu = strdup(ppmu); + je.pmu = strdup(ppmu); } else { - if (!pmu) - pmu = strdup("uncore_"); - addfield(map, &pmu, "", "", val); - for (s = pmu; *s; s++) + if (!je.pmu) + je.pmu = strdup("uncore_"); + addfield(map, &je.pmu, "", "", val); + for (s = je.pmu; *s; s++) *s = tolower(*s); } - addfield(map, &desc, ". ", "Unit: ", NULL); - addfield(map, &desc, "", pmu, NULL); - addfield(map, &desc, "", " ", NULL); + addfield(map, &je.desc, ". ", "Unit: ", NULL); + addfield(map, &je.desc, "", je.pmu, NULL); + addfield(map, &je.desc, "", " ", NULL); } else if (json_streq(map, field, "Filter")) { addfield(map, &filter, "", "", val); } else if (json_streq(map, field, "ScaleUnit")) { - addfield(map, &unit, "", "", val); + addfield(map, &je.unit, "", "", val); } else if (json_streq(map, field, "PerPkg")) { - addfield(map, &perpkg, "", "", val); + addfield(map, &je.perpkg, "", "", val); } else if (json_streq(map, field, "Deprecated")) { - addfield(map, &deprecated, "", "", val); + addfield(map, &je.deprecated, "", "", val); } else if (json_streq(map, field, "MetricName")) { - addfield(map, &metric_name, "", "", val); + addfield(map, &je.metric_name, "", "", val); } else if (json_streq(map, field, "MetricGroup")) { - addfield(map, &metric_group, "", "", val); + addfield(map, &je.metric_group, "", "", val); } else if (json_streq(map, field, "MetricConstraint")) { - addfield(map, &metric_constraint, "", "", val); + addfield(map, &je.metric_constraint, "", "", val); } else if (json_streq(map, field, "MetricExpr")) { - addfield(map, &metric_expr, "", "", val); - for (s = metric_expr; *s; s++) + addfield(map, &je.metric_expr, "", "", val); + for (s = je.metric_expr; *s; s++) *s = tolower(*s); } else if (json_streq(map, field, "ArchStdEvent")) { addfield(map, &arch_std, "", "", val); @@ -645,7 +632,7 @@ static int json_events(const char *fn, } /* ignore unknown fields */ } - if (precise && desc && !strstr(desc, "(Precise Event)")) { + if (precise && je.desc && !strstr(je.desc, "(Precise Event)")) { if (json_streq(map, precise, "2")) addfield(map, &extra_desc, " ", "(Must be precise)", NULL); @@ -655,48 +642,43 @@ static int json_events(const char *fn, } snprintf(buf, sizeof buf, "event=%#llx", eventcode); addfield(map, &event, ",", buf, NULL); - if (desc && extra_desc) - addfield(map, &desc, " ", extra_desc, NULL); - if (long_desc && extra_desc) - addfield(map, &long_desc, " ", extra_desc, NULL); + if (je.desc && extra_desc) + addfield(map, &je.desc, " ", extra_desc, NULL); + if (je.long_desc && extra_desc) + addfield(map, &je.long_desc, " ", extra_desc, NULL); if (filter) addfield(map, &event, ",", filter, NULL); if (msr != NULL) addfield(map, &event, ",", msr->pname, msrval); - if (name) - fixname(name); + if (je.name) + fixname(je.name); if (arch_std) { /* * An arch standard event is referenced, so try to * fixup any unassigned values. */ - err = try_fixup(fn, arch_std, &event, &desc, &name, - &long_desc, &pmu, &filter, &perpkg, - &unit, &metric_expr, &metric_name, - &metric_group, eventcode, - &deprecated, &metric_constraint); + err = try_fixup(fn, arch_std, eventcode, &je); if (err) goto free_strings; } - err = func(data, name, real_event(name, event), desc, long_desc, - pmu, unit, perpkg, metric_expr, metric_name, - metric_group, deprecated, metric_constraint); + je.event = real_event(je.name, event); + err = func(data, &je); free_strings: free(event); - free(desc); - free(name); - free(long_desc); + free(je.desc); + free(je.name); + free(je.long_desc); free(extra_desc); - free(pmu); + free(je.pmu); free(filter); - free(perpkg); - free(deprecated); - free(unit); - free(metric_expr); - free(metric_name); - free(metric_group); - free(metric_constraint); + free(je.perpkg); + free(je.deprecated); + free(je.unit); + free(je.metric_expr); + free(je.metric_name); + free(je.metric_group); + free(je.metric_constraint); free(arch_std); if (err) -- 2.26.2 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v8 3/5] perf jevents: Add support for parsing perchip/percore events 2020-09-06 11:19 [PATCH v8 0/5] powerpc/perf: Add json file support for hv_24x7 core level events Kajol Jain 2020-09-06 11:20 ` [PATCH v8 1/5] perf/jevents: Remove jevents.h file Kajol Jain 2020-09-06 11:20 ` [PATCH v8 2/5] perf/jevents: Add new structure to pass json fields Kajol Jain @ 2020-09-06 11:20 ` Kajol Jain 2020-09-06 12:55 ` Jiri Olsa 2020-09-06 11:20 ` [PATCH v8 4/5] perf/tools: Pass pmu_event structure as a parameter for arch_get_runtimeparam Kajol Jain 2020-09-06 11:20 ` [PATCH v8 5/5] perf/tools/pmu_events/powerpc: Add hv_24x7 core level metric events Kajol Jain 4 siblings, 1 reply; 8+ messages in thread From: Kajol Jain @ 2020-09-06 11:20 UTC (permalink / raw) To: acme Cc: peterz, mingo, mark.rutland, alexander.shishkin, pc, jolsa, namhyung, ak, yao.jin, linux-kernel, linux-perf-users, irogers, maddy, ravi.bangoria, john.garry, kjain Initially, every time we want to add new terms like chip, core thread etc, we need to create corrsponding fields in pmu_events and event struct. This patch adds an enum called 'aggr_mode_class' which store all these aggregation like perchip/percore. It also adds new field 'aggr_mode' to capture these terms. Now, if user wants to add any new term, they just need to add it in the enum defined. Signed-off-by: Kajol Jain <kjain@linux.ibm.com> --- tools/perf/pmu-events/jevents.c | 19 +++++++++++++++++++ tools/perf/pmu-events/pmu-events.h | 6 ++++++ 2 files changed, 25 insertions(+) diff --git a/tools/perf/pmu-events/jevents.c b/tools/perf/pmu-events/jevents.c index 388dd287d736..ebfb295bba05 100644 --- a/tools/perf/pmu-events/jevents.c +++ b/tools/perf/pmu-events/jevents.c @@ -48,6 +48,7 @@ #include <linux/list.h> #include "jsmn.h" #include "json.h" +#include "pmu-events.h" int verbose; char *prog; @@ -60,6 +61,7 @@ struct json_event { char *pmu; char *unit; char *perpkg; + char *aggr_mode; char *metric_expr; char *metric_name; char *metric_group; @@ -67,6 +69,17 @@ struct json_event { char *metric_constraint; }; +enum aggr_mode_class convert(const char *aggr_mode) +{ + if (!strcmp(aggr_mode, "PerCore")) + return PerCore; + else if (!strcmp(aggr_mode, "PerChip")) + return PerChip; + + pr_err("%s: Wrong AggregationMode value '%s'\n", prog, aggr_mode); + return -1; +} + typedef int (*func)(void *data, struct json_event *je); int eprintf(int level, int var, const char *fmt, ...) @@ -355,6 +368,8 @@ static int print_events_table_entry(void *data, struct json_event *je) fprintf(outfp, "\t.unit = \"%s\",\n", je->unit); if (je->perpkg) fprintf(outfp, "\t.perpkg = \"%s\",\n", je->perpkg); + if (je->aggr_mode) + fprintf(outfp, "\t.aggr_mode = \"%d\",\n", convert(je->aggr_mode)); if (je->metric_expr) fprintf(outfp, "\t.metric_expr = \"%s\",\n", je->metric_expr); if (je->metric_name) @@ -379,6 +394,7 @@ struct event_struct { char *pmu; char *unit; char *perpkg; + char *aggr_mode; char *metric_expr; char *metric_name; char *metric_group; @@ -408,6 +424,7 @@ struct event_struct { op(pmu); \ op(unit); \ op(perpkg); \ + op(aggr_mode); \ op(metric_expr); \ op(metric_name); \ op(metric_group); \ @@ -613,6 +630,8 @@ static int json_events(const char *fn, addfield(map, &je.unit, "", "", val); } else if (json_streq(map, field, "PerPkg")) { addfield(map, &je.perpkg, "", "", val); + } else if (json_streq(map, field, "AggregationMode")) { + addfield(map, &je.aggr_mode, "", "", val); } else if (json_streq(map, field, "Deprecated")) { addfield(map, &je.deprecated, "", "", val); } else if (json_streq(map, field, "MetricName")) { diff --git a/tools/perf/pmu-events/pmu-events.h b/tools/perf/pmu-events/pmu-events.h index c8f306b572f4..7da1a3743b77 100644 --- a/tools/perf/pmu-events/pmu-events.h +++ b/tools/perf/pmu-events/pmu-events.h @@ -2,6 +2,11 @@ #ifndef PMU_EVENTS_H #define PMU_EVENTS_H +enum aggr_mode_class { + PerChip = 1, + PerCore +}; + /* * Describe each PMU event. Each CPU has a table of PMU events. */ @@ -14,6 +19,7 @@ struct pmu_event { const char *pmu; const char *unit; const char *perpkg; + const char *aggr_mode; const char *metric_expr; const char *metric_name; const char *metric_group; -- 2.26.2 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v8 3/5] perf jevents: Add support for parsing perchip/percore events 2020-09-06 11:20 ` [PATCH v8 3/5] perf jevents: Add support for parsing perchip/percore events Kajol Jain @ 2020-09-06 12:55 ` Jiri Olsa 2020-09-07 6:40 ` kajoljain 0 siblings, 1 reply; 8+ messages in thread From: Jiri Olsa @ 2020-09-06 12:55 UTC (permalink / raw) To: Kajol Jain Cc: acme, peterz, mingo, mark.rutland, alexander.shishkin, pc, namhyung, ak, yao.jin, linux-kernel, linux-perf-users, irogers, maddy, ravi.bangoria, john.garry On Sun, Sep 06, 2020 at 04:50:02PM +0530, Kajol Jain wrote: SNIP > typedef int (*func)(void *data, struct json_event *je); > > int eprintf(int level, int var, const char *fmt, ...) > @@ -355,6 +368,8 @@ static int print_events_table_entry(void *data, struct json_event *je) > fprintf(outfp, "\t.unit = \"%s\",\n", je->unit); > if (je->perpkg) > fprintf(outfp, "\t.perpkg = \"%s\",\n", je->perpkg); > + if (je->aggr_mode) > + fprintf(outfp, "\t.aggr_mode = \"%d\",\n", convert(je->aggr_mode)); > if (je->metric_expr) > fprintf(outfp, "\t.metric_expr = \"%s\",\n", je->metric_expr); > if (je->metric_name) > @@ -379,6 +394,7 @@ struct event_struct { > char *pmu; > char *unit; > char *perpkg; > + char *aggr_mode; > char *metric_expr; > char *metric_name; > char *metric_group; > @@ -408,6 +424,7 @@ struct event_struct { > op(pmu); \ > op(unit); \ > op(perpkg); \ > + op(aggr_mode); \ > op(metric_expr); \ > op(metric_name); \ > op(metric_group); \ > @@ -613,6 +630,8 @@ static int json_events(const char *fn, > addfield(map, &je.unit, "", "", val); > } else if (json_streq(map, field, "PerPkg")) { > addfield(map, &je.perpkg, "", "", val); > + } else if (json_streq(map, field, "AggregationMode")) { > + addfield(map, &je.aggr_mode, "", "", val); I think you should free je.aggr_mode jirka > } else if (json_streq(map, field, "Deprecated")) { > addfield(map, &je.deprecated, "", "", val); > } else if (json_streq(map, field, "MetricName")) { > diff --git a/tools/perf/pmu-events/pmu-events.h b/tools/perf/pmu-events/pmu-events.h > index c8f306b572f4..7da1a3743b77 100644 > --- a/tools/perf/pmu-events/pmu-events.h > +++ b/tools/perf/pmu-events/pmu-events.h > @@ -2,6 +2,11 @@ > #ifndef PMU_EVENTS_H > #define PMU_EVENTS_H > > +enum aggr_mode_class { > + PerChip = 1, > + PerCore > +}; > + > /* > * Describe each PMU event. Each CPU has a table of PMU events. > */ > @@ -14,6 +19,7 @@ struct pmu_event { > const char *pmu; > const char *unit; > const char *perpkg; > + const char *aggr_mode; > const char *metric_expr; > const char *metric_name; > const char *metric_group; > -- > 2.26.2 > ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v8 3/5] perf jevents: Add support for parsing perchip/percore events 2020-09-06 12:55 ` Jiri Olsa @ 2020-09-07 6:40 ` kajoljain 0 siblings, 0 replies; 8+ messages in thread From: kajoljain @ 2020-09-07 6:40 UTC (permalink / raw) To: Jiri Olsa Cc: acme, peterz, mingo, mark.rutland, alexander.shishkin, pc, namhyung, ak, yao.jin, linux-kernel, linux-perf-users, irogers, maddy, ravi.bangoria, john.garry On 9/6/20 6:25 PM, Jiri Olsa wrote: > On Sun, Sep 06, 2020 at 04:50:02PM +0530, Kajol Jain wrote: > > SNIP > >> typedef int (*func)(void *data, struct json_event *je); >> >> int eprintf(int level, int var, const char *fmt, ...) >> @@ -355,6 +368,8 @@ static int print_events_table_entry(void *data, struct json_event *je) >> fprintf(outfp, "\t.unit = \"%s\",\n", je->unit); >> if (je->perpkg) >> fprintf(outfp, "\t.perpkg = \"%s\",\n", je->perpkg); >> + if (je->aggr_mode) >> + fprintf(outfp, "\t.aggr_mode = \"%d\",\n", convert(je->aggr_mode)); >> if (je->metric_expr) >> fprintf(outfp, "\t.metric_expr = \"%s\",\n", je->metric_expr); >> if (je->metric_name) >> @@ -379,6 +394,7 @@ struct event_struct { >> char *pmu; >> char *unit; >> char *perpkg; >> + char *aggr_mode; >> char *metric_expr; >> char *metric_name; >> char *metric_group; >> @@ -408,6 +424,7 @@ struct event_struct { >> op(pmu); \ >> op(unit); \ >> op(perpkg); \ >> + op(aggr_mode); \ >> op(metric_expr); \ >> op(metric_name); \ >> op(metric_group); \ >> @@ -613,6 +630,8 @@ static int json_events(const char *fn, >> addfield(map, &je.unit, "", "", val); >> } else if (json_streq(map, field, "PerPkg")) { >> addfield(map, &je.perpkg, "", "", val); >> + } else if (json_streq(map, field, "AggregationMode")) { >> + addfield(map, &je.aggr_mode, "", "", val); > > I think you should free je.aggr_mode My bad, missed that part. Will send updated one. Thanks, Kajol Jain > > jirka > >> } else if (json_streq(map, field, "Deprecated")) { >> addfield(map, &je.deprecated, "", "", val); >> } else if (json_streq(map, field, "MetricName")) { >> diff --git a/tools/perf/pmu-events/pmu-events.h b/tools/perf/pmu-events/pmu-events.h >> index c8f306b572f4..7da1a3743b77 100644 >> --- a/tools/perf/pmu-events/pmu-events.h >> +++ b/tools/perf/pmu-events/pmu-events.h >> @@ -2,6 +2,11 @@ >> #ifndef PMU_EVENTS_H >> #define PMU_EVENTS_H >> >> +enum aggr_mode_class { >> + PerChip = 1, >> + PerCore >> +}; >> + >> /* >> * Describe each PMU event. Each CPU has a table of PMU events. >> */ >> @@ -14,6 +19,7 @@ struct pmu_event { >> const char *pmu; >> const char *unit; >> const char *perpkg; >> + const char *aggr_mode; >> const char *metric_expr; >> const char *metric_name; >> const char *metric_group; >> -- >> 2.26.2 >> > ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v8 4/5] perf/tools: Pass pmu_event structure as a parameter for arch_get_runtimeparam 2020-09-06 11:19 [PATCH v8 0/5] powerpc/perf: Add json file support for hv_24x7 core level events Kajol Jain ` (2 preceding siblings ...) 2020-09-06 11:20 ` [PATCH v8 3/5] perf jevents: Add support for parsing perchip/percore events Kajol Jain @ 2020-09-06 11:20 ` Kajol Jain 2020-09-06 11:20 ` [PATCH v8 5/5] perf/tools/pmu_events/powerpc: Add hv_24x7 core level metric events Kajol Jain 4 siblings, 0 replies; 8+ messages in thread From: Kajol Jain @ 2020-09-06 11:20 UTC (permalink / raw) To: acme Cc: peterz, mingo, mark.rutland, alexander.shishkin, pc, jolsa, namhyung, ak, yao.jin, linux-kernel, linux-perf-users, irogers, maddy, ravi.bangoria, john.garry, kjain This patch adds passing of pmu_event as a parameter in function 'arch_get_runtimeparam' which can be used to get details like if the event is percore/perchip. Signed-off-by: Kajol Jain <kjain@linux.ibm.com> Acked-by: Ian Rogers <irogers@google.com> --- tools/perf/arch/powerpc/util/header.c | 7 +++++-- tools/perf/util/metricgroup.c | 5 ++--- tools/perf/util/metricgroup.h | 3 ++- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/tools/perf/arch/powerpc/util/header.c b/tools/perf/arch/powerpc/util/header.c index 1a950171a66f..58b2d610aadb 100644 --- a/tools/perf/arch/powerpc/util/header.c +++ b/tools/perf/arch/powerpc/util/header.c @@ -40,8 +40,11 @@ get_cpuid_str(struct perf_pmu *pmu __maybe_unused) return bufp; } -int arch_get_runtimeparam(void) +int arch_get_runtimeparam(struct pmu_event *pe) { int count; - return sysfs__read_int("/devices/hv_24x7/interface/sockets", &count) < 0 ? 1 : count; + char path[PATH_MAX] = "/devices/hv_24x7/interface/"; + + atoi(pe->aggr_mode) == PerChip ? strcat(path, "sockets") : strcat(path, "coresperchip"); + return sysfs__read_int(path, &count) < 0 ? 1 : count; } diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c index 8831b964288f..c387aa1615ba 100644 --- a/tools/perf/util/metricgroup.c +++ b/tools/perf/util/metricgroup.c @@ -15,7 +15,6 @@ #include "rblist.h" #include <string.h> #include <errno.h> -#include "pmu-events/pmu-events.h" #include "strlist.h" #include <assert.h> #include <linux/ctype.h> @@ -634,7 +633,7 @@ static bool metricgroup__has_constraint(struct pmu_event *pe) return false; } -int __weak arch_get_runtimeparam(void) +int __weak arch_get_runtimeparam(struct pmu_event *pe __maybe_unused) { return 1; } @@ -902,7 +901,7 @@ static int add_metric(struct list_head *metric_list, } else { int j, count; - count = arch_get_runtimeparam(); + count = arch_get_runtimeparam(pe); /* This loop is added to create multiple * events depend on count value and add diff --git a/tools/perf/util/metricgroup.h b/tools/perf/util/metricgroup.h index 62623a39cbec..491a5d78252d 100644 --- a/tools/perf/util/metricgroup.h +++ b/tools/perf/util/metricgroup.h @@ -5,6 +5,7 @@ #include <linux/list.h> #include <linux/rbtree.h> #include <stdbool.h> +#include "pmu-events/pmu-events.h" struct evsel; struct evlist; @@ -52,6 +53,6 @@ int metricgroup__parse_groups_test(struct evlist *evlist, void metricgroup__print(bool metrics, bool groups, char *filter, bool raw, bool details); bool metricgroup__has_metric(const char *metric); -int arch_get_runtimeparam(void); +int arch_get_runtimeparam(struct pmu_event *pe __maybe_unused); void metricgroup__rblist_exit(struct rblist *metric_events); #endif -- 2.26.2 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v8 5/5] perf/tools/pmu_events/powerpc: Add hv_24x7 core level metric events 2020-09-06 11:19 [PATCH v8 0/5] powerpc/perf: Add json file support for hv_24x7 core level events Kajol Jain ` (3 preceding siblings ...) 2020-09-06 11:20 ` [PATCH v8 4/5] perf/tools: Pass pmu_event structure as a parameter for arch_get_runtimeparam Kajol Jain @ 2020-09-06 11:20 ` Kajol Jain 4 siblings, 0 replies; 8+ messages in thread From: Kajol Jain @ 2020-09-06 11:20 UTC (permalink / raw) To: acme Cc: peterz, mingo, mark.rutland, alexander.shishkin, pc, jolsa, namhyung, ak, yao.jin, linux-kernel, linux-perf-users, irogers, maddy, ravi.bangoria, john.garry, kjain This patch adds hv_24x7 core level events in nest_metric.json file and also add PerChip/PerCore field in metric events. Result: power9 platform: command:# ./perf stat --metric-only -M PowerBUS_Frequency -C 0 -I 1000 1.000070601 1.9 2.0 2.000253881 2.0 1.9 3.000364810 2.0 2.0 Signed-off-by: Kajol Jain <kjain@linux.ibm.com> Acked-by: Ian Rogers <irogers@google.com> --- .../arch/powerpc/power9/nest_metrics.json | 35 ++++++++++++------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/tools/perf/pmu-events/arch/powerpc/power9/nest_metrics.json b/tools/perf/pmu-events/arch/powerpc/power9/nest_metrics.json index 8383a37647ad..7a5d1bf543f8 100644 --- a/tools/perf/pmu-events/arch/powerpc/power9/nest_metrics.json +++ b/tools/perf/pmu-events/arch/powerpc/power9/nest_metrics.json @@ -1,37 +1,46 @@ [ { - "MetricExpr": "(hv_24x7@PM_MCS01_128B_RD_DISP_PORT01\\,chip\\=?@ + hv_24x7@PM_MCS01_128B_RD_DISP_PORT23\\,chip\\=?@ + hv_24x7@PM_MCS23_128B_RD_DISP_PORT01\\,chip\\=?@ + hv_24x7@PM_MCS23_128B_RD_DISP_PORT23\\,chip\\=?@)", - "MetricName": "Memory_RD_BW_Chip", - "MetricGroup": "Memory_BW", - "ScaleUnit": "1.6e-2MB" + "MetricExpr": "(hv_24x7@PM_MCS01_128B_RD_DISP_PORT01\\,chip\\=?@ + hv_24x7@PM_MCS01_128B_RD_DISP_PORT23\\,chip\\=?@ + hv_24x7@PM_MCS23_128B_RD_DISP_PORT01\\,chip\\=?@ + hv_24x7@PM_MCS23_128B_RD_DISP_PORT23\\,chip\\=?@)", + "MetricName": "Memory_RD_BW_Chip", + "MetricGroup": "Memory_BW", + "ScaleUnit": "1.6e-2MB", + "AggregationMode": "PerChip" }, { "MetricExpr": "(hv_24x7@PM_MCS01_128B_WR_DISP_PORT01\\,chip\\=?@ + hv_24x7@PM_MCS01_128B_WR_DISP_PORT23\\,chip\\=?@ + hv_24x7@PM_MCS23_128B_WR_DISP_PORT01\\,chip\\=?@ + hv_24x7@PM_MCS23_128B_WR_DISP_PORT23\\,chip\\=?@ )", - "MetricName": "Memory_WR_BW_Chip", - "MetricGroup": "Memory_BW", - "ScaleUnit": "1.6e-2MB" + "MetricName": "Memory_WR_BW_Chip", + "MetricGroup": "Memory_BW", + "ScaleUnit": "1.6e-2MB", + "AggregationMode": "PerChip" }, { "MetricExpr": "(hv_24x7@PM_PB_CYC\\,chip\\=?@ )", - "MetricName": "PowerBUS_Frequency", - "ScaleUnit": "2.5e-7GHz" + "MetricName": "PowerBUS_Frequency", + "ScaleUnit": "2.5e-7GHz", + "AggregationMode": "PerChip" + }, + { + "MetricExpr": "(hv_24x7@CPM_CS_32MHZ_CYC\\,domain\\=3\\,core\\=?@ )", + "MetricName": "CPM_CS_32MHZ_CYC", + "ScaleUnit": "1MHz", + "AggregationMode": "PerCore" }, { "MetricExpr" : "nest_mcs01_imc@PM_MCS01_128B_RD_DISP_PORT01@ + nest_mcs01_imc@PM_MCS01_128B_RD_DISP_PORT23@", "MetricName" : "mcs01-read", - "MetricGroup" : "memory_bw", + "MetricGroup" : "memory-bandwidth", "ScaleUnit": "6.1e-5MB" }, { "MetricExpr" : "nest_mcs23_imc@PM_MCS23_128B_RD_DISP_PORT01@ + nest_mcs23_imc@PM_MCS23_128B_RD_DISP_PORT23@", "MetricName" : "mcs23-read", - "MetricGroup" : "memory_bw", + "MetricGroup" : "memory-bandwidth", "ScaleUnit": "6.1e-5MB" }, { "MetricExpr" : "nest_mcs01_imc@PM_MCS01_128B_WR_DISP_PORT01@ + nest_mcs01_imc@PM_MCS01_128B_WR_DISP_PORT23@", "MetricName" : "mcs01-write", - "MetricGroup" : "memory_bw", + "MetricGroup" : "memory-bandwidth", "ScaleUnit": "6.1e-5MB" }, { @@ -48,7 +57,7 @@ { "MetricExpr" : "(nest_mcs01_imc@PM_MCS01_128B_RD_DISP_PORT01@ + nest_mcs01_imc@PM_MCS01_128B_RD_DISP_PORT23@ + nest_mcs23_imc@PM_MCS23_128B_RD_DISP_PORT01@ + nest_mcs23_imc@PM_MCS23_128B_RD_DISP_PORT23@ + nest_mcs01_imc@PM_MCS01_128B_WR_DISP_PORT01@ + nest_mcs01_imc@PM_MCS01_128B_WR_DISP_PORT23@ + nest_mcs23_imc@PM_MCS23_128B_WR_DISP_PORT01@ + nest_mcs23_imc@PM_MCS23_128B_WR_DISP_PORT23@)", "MetricName" : "Memory-bandwidth-MCS", - "MetricGroup" : "memory_bw", + "MetricGroup" : "memory-bandwidth", "ScaleUnit": "6.1e-5MB" } ] -- 2.26.2 ^ permalink raw reply related [flat|nested] 8+ messages in thread
end of thread, other threads:[~2020-09-07 6:40 UTC | newest] Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2020-09-06 11:19 [PATCH v8 0/5] powerpc/perf: Add json file support for hv_24x7 core level events Kajol Jain 2020-09-06 11:20 ` [PATCH v8 1/5] perf/jevents: Remove jevents.h file Kajol Jain 2020-09-06 11:20 ` [PATCH v8 2/5] perf/jevents: Add new structure to pass json fields Kajol Jain 2020-09-06 11:20 ` [PATCH v8 3/5] perf jevents: Add support for parsing perchip/percore events Kajol Jain 2020-09-06 12:55 ` Jiri Olsa 2020-09-07 6:40 ` kajoljain 2020-09-06 11:20 ` [PATCH v8 4/5] perf/tools: Pass pmu_event structure as a parameter for arch_get_runtimeparam Kajol Jain 2020-09-06 11:20 ` [PATCH v8 5/5] perf/tools/pmu_events/powerpc: Add hv_24x7 core level metric events Kajol Jain
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).