|
@@ -291,7 +291,8 @@ static void print_events_table_prefix(FILE *fp, const char *tblname)
|
|
|
|
|
|
static int print_events_table_entry(void *data, char *name, char *event,
|
|
|
char *desc, char *long_desc,
|
|
|
- char *pmu, char *unit, char *perpkg)
|
|
|
+ char *pmu, char *unit, char *perpkg,
|
|
|
+ char *metric_expr)
|
|
|
{
|
|
|
struct perf_entry_data *pd = data;
|
|
|
FILE *outfp = pd->outfp;
|
|
@@ -315,6 +316,8 @@ static int print_events_table_entry(void *data, char *name, char *event,
|
|
|
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);
|
|
|
fprintf(outfp, "},\n");
|
|
|
|
|
|
return 0;
|
|
@@ -362,7 +365,8 @@ static char *real_event(const char *name, char *event)
|
|
|
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 *pmu, char *unit, char *perpkg,
|
|
|
+ char *metric_expr),
|
|
|
void *data)
|
|
|
{
|
|
|
int err = -EIO;
|
|
@@ -388,6 +392,7 @@ int json_events(const char *fn,
|
|
|
char *filter = NULL;
|
|
|
char *perpkg = NULL;
|
|
|
char *unit = NULL;
|
|
|
+ char *metric_expr = NULL;
|
|
|
unsigned long long eventcode = 0;
|
|
|
struct msrmap *msr = NULL;
|
|
|
jsmntok_t *msrval = NULL;
|
|
@@ -398,6 +403,7 @@ int json_events(const char *fn,
|
|
|
for (j = 0; j < obj->size; j += 2) {
|
|
|
jsmntok_t *field, *val;
|
|
|
int nz;
|
|
|
+ char *s;
|
|
|
|
|
|
field = tok + j;
|
|
|
EXPECT(field->type == JSMN_STRING, tok + j,
|
|
@@ -444,7 +450,6 @@ int json_events(const char *fn,
|
|
|
NULL);
|
|
|
} else if (json_streq(map, field, "Unit")) {
|
|
|
const char *ppmu;
|
|
|
- char *s;
|
|
|
|
|
|
ppmu = field_to_perf(unit_to_pmu, map, val);
|
|
|
if (ppmu) {
|
|
@@ -464,6 +469,10 @@ int json_events(const char *fn,
|
|
|
addfield(map, &unit, "", "", val);
|
|
|
} else if (json_streq(map, field, "PerPkg")) {
|
|
|
addfield(map, &perpkg, "", "", val);
|
|
|
+ } else if (json_streq(map, field, "MetricExpr")) {
|
|
|
+ addfield(map, &metric_expr, "", "", val);
|
|
|
+ for (s = metric_expr; *s; s++)
|
|
|
+ *s = tolower(*s);
|
|
|
}
|
|
|
/* ignore unknown fields */
|
|
|
}
|
|
@@ -488,7 +497,7 @@ int json_events(const char *fn,
|
|
|
fixname(name);
|
|
|
|
|
|
err = func(data, name, real_event(name, event), desc, long_desc,
|
|
|
- pmu, unit, perpkg);
|
|
|
+ pmu, unit, perpkg, metric_expr);
|
|
|
free(event);
|
|
|
free(desc);
|
|
|
free(name);
|
|
@@ -498,6 +507,7 @@ int json_events(const char *fn,
|
|
|
free(filter);
|
|
|
free(perpkg);
|
|
|
free(unit);
|
|
|
+ free(metric_expr);
|
|
|
if (err)
|
|
|
break;
|
|
|
tok += j;
|