diff options
author | Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com> | 2016-09-15 18:24:47 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2016-10-03 20:35:46 -0400 |
commit | 794ba54a8393456d503958d6217874e455b6a771 (patch) | |
tree | c104ac4fd8378a1fe88dd21e3757726d28a1e31e | |
parent | fc06e2a5aad9fcf7efaabd7550ac31f648d2f2bc (diff) |
perf jevents: Add support for long descriptions
Implement support in jevents to parse long descriptions for events that
may have them in the JSON files. A follow on patch will make this long
description available to user through the 'perf list' command.
Signed-off-by: Andi Kleen <ak@linux.intel.com>
Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Acked-by: Ingo Molnar <mingo@kernel.org>
Acked-by: Jiri Olsa <jolsa@redhat.com>
Cc: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: linuxppc-dev@lists.ozlabs.org
Link: http://lkml.kernel.org/r/1473978296-20712-11-git-send-email-sukadev@linux.vnet.ibm.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r-- | tools/perf/pmu-events/jevents.c | 32 | ||||
-rw-r--r-- | tools/perf/pmu-events/jevents.h | 3 | ||||
-rw-r--r-- | tools/perf/pmu-events/pmu-events.h | 1 |
3 files changed, 27 insertions, 9 deletions
diff --git a/tools/perf/pmu-events/jevents.c b/tools/perf/pmu-events/jevents.c index c9bf9a7dc7b2..13f4284721d5 100644 --- a/tools/perf/pmu-events/jevents.c +++ b/tools/perf/pmu-events/jevents.c | |||
@@ -269,7 +269,7 @@ static void print_events_table_prefix(FILE *fp, const char *tblname) | |||
269 | } | 269 | } |
270 | 270 | ||
271 | static int print_events_table_entry(void *data, char *name, char *event, | 271 | static int print_events_table_entry(void *data, char *name, char *event, |
272 | char *desc) | 272 | char *desc, char *long_desc) |
273 | { | 273 | { |
274 | struct perf_entry_data *pd = data; | 274 | struct perf_entry_data *pd = data; |
275 | FILE *outfp = pd->outfp; | 275 | FILE *outfp = pd->outfp; |
@@ -285,6 +285,8 @@ static int print_events_table_entry(void *data, char *name, char *event, | |||
285 | fprintf(outfp, "\t.event = \"%s\",\n", event); | 285 | fprintf(outfp, "\t.event = \"%s\",\n", event); |
286 | fprintf(outfp, "\t.desc = \"%s\",\n", desc); | 286 | fprintf(outfp, "\t.desc = \"%s\",\n", desc); |
287 | fprintf(outfp, "\t.topic = \"%s\",\n", topic); | 287 | fprintf(outfp, "\t.topic = \"%s\",\n", topic); |
288 | if (long_desc && long_desc[0]) | ||
289 | fprintf(outfp, "\t.long_desc = \"%s\",\n", long_desc); | ||
288 | 290 | ||
289 | fprintf(outfp, "},\n"); | 291 | fprintf(outfp, "},\n"); |
290 | 292 | ||
@@ -306,7 +308,8 @@ static void print_events_table_suffix(FILE *outfp) | |||
306 | 308 | ||
307 | /* Call func with each event in the json file */ | 309 | /* Call func with each event in the json file */ |
308 | int json_events(const char *fn, | 310 | int json_events(const char *fn, |
309 | int (*func)(void *data, char *name, char *event, char *desc), | 311 | int (*func)(void *data, char *name, char *event, char *desc, |
312 | char *long_desc), | ||
310 | void *data) | 313 | void *data) |
311 | { | 314 | { |
312 | int err = -EIO; | 315 | int err = -EIO; |
@@ -325,6 +328,8 @@ int json_events(const char *fn, | |||
325 | tok = tokens + 1; | 328 | tok = tokens + 1; |
326 | for (i = 0; i < tokens->size; i++) { | 329 | for (i = 0; i < tokens->size; i++) { |
327 | char *event = NULL, *desc = NULL, *name = NULL; | 330 | char *event = NULL, *desc = NULL, *name = NULL; |
331 | char *long_desc = NULL; | ||
332 | char *extra_desc = NULL; | ||
328 | struct msrmap *msr = NULL; | 333 | struct msrmap *msr = NULL; |
329 | jsmntok_t *msrval = NULL; | 334 | jsmntok_t *msrval = NULL; |
330 | jsmntok_t *precise = NULL; | 335 | jsmntok_t *precise = NULL; |
@@ -350,6 +355,10 @@ int json_events(const char *fn, | |||
350 | } else if (json_streq(map, field, "BriefDescription")) { | 355 | } else if (json_streq(map, field, "BriefDescription")) { |
351 | addfield(map, &desc, "", "", val); | 356 | addfield(map, &desc, "", "", val); |
352 | fixdesc(desc); | 357 | fixdesc(desc); |
358 | } else if (json_streq(map, field, | ||
359 | "PublicDescription")) { | ||
360 | addfield(map, &long_desc, "", "", val); | ||
361 | fixdesc(long_desc); | ||
353 | } else if (json_streq(map, field, "PEBS") && nz) { | 362 | } else if (json_streq(map, field, "PEBS") && nz) { |
354 | precise = val; | 363 | precise = val; |
355 | } else if (json_streq(map, field, "MSRIndex") && nz) { | 364 | } else if (json_streq(map, field, "MSRIndex") && nz) { |
@@ -358,10 +367,10 @@ int json_events(const char *fn, | |||
358 | msrval = val; | 367 | msrval = val; |
359 | } else if (json_streq(map, field, "Errata") && | 368 | } else if (json_streq(map, field, "Errata") && |
360 | !json_streq(map, val, "null")) { | 369 | !json_streq(map, val, "null")) { |
361 | addfield(map, &desc, ". ", | 370 | addfield(map, &extra_desc, ". ", |
362 | " Spec update: ", val); | 371 | " Spec update: ", val); |
363 | } else if (json_streq(map, field, "Data_LA") && nz) { | 372 | } else if (json_streq(map, field, "Data_LA") && nz) { |
364 | addfield(map, &desc, ". ", | 373 | addfield(map, &extra_desc, ". ", |
365 | " Supports address when precise", | 374 | " Supports address when precise", |
366 | NULL); | 375 | NULL); |
367 | } | 376 | } |
@@ -369,19 +378,26 @@ int json_events(const char *fn, | |||
369 | } | 378 | } |
370 | if (precise && desc && !strstr(desc, "(Precise Event)")) { | 379 | if (precise && desc && !strstr(desc, "(Precise Event)")) { |
371 | if (json_streq(map, precise, "2")) | 380 | if (json_streq(map, precise, "2")) |
372 | addfield(map, &desc, " ", "(Must be precise)", | 381 | addfield(map, &extra_desc, " ", |
373 | NULL); | 382 | "(Must be precise)", NULL); |
374 | else | 383 | else |
375 | addfield(map, &desc, " ", | 384 | addfield(map, &extra_desc, " ", |
376 | "(Precise event)", NULL); | 385 | "(Precise event)", NULL); |
377 | } | 386 | } |
387 | if (desc && extra_desc) | ||
388 | addfield(map, &desc, " ", extra_desc, NULL); | ||
389 | if (long_desc && extra_desc) | ||
390 | addfield(map, &long_desc, " ", extra_desc, NULL); | ||
378 | if (msr != NULL) | 391 | if (msr != NULL) |
379 | addfield(map, &event, ",", msr->pname, msrval); | 392 | addfield(map, &event, ",", msr->pname, msrval); |
380 | fixname(name); | 393 | fixname(name); |
381 | err = func(data, name, event, desc); | 394 | |
395 | err = func(data, name, event, desc, long_desc); | ||
382 | free(event); | 396 | free(event); |
383 | free(desc); | 397 | free(desc); |
384 | free(name); | 398 | free(name); |
399 | free(long_desc); | ||
400 | free(extra_desc); | ||
385 | if (err) | 401 | if (err) |
386 | break; | 402 | break; |
387 | tok += j; | 403 | tok += j; |
diff --git a/tools/perf/pmu-events/jevents.h b/tools/perf/pmu-events/jevents.h index 996601f828b6..b0eb2744b498 100644 --- a/tools/perf/pmu-events/jevents.h +++ b/tools/perf/pmu-events/jevents.h | |||
@@ -2,7 +2,8 @@ | |||
2 | #define JEVENTS_H 1 | 2 | #define JEVENTS_H 1 |
3 | 3 | ||
4 | int json_events(const char *fn, | 4 | int json_events(const char *fn, |
5 | int (*func)(void *data, char *name, char *event, char *desc), | 5 | int (*func)(void *data, char *name, char *event, char *desc, |
6 | char *long_desc), | ||
6 | void *data); | 7 | void *data); |
7 | char *get_cpu_str(void); | 8 | char *get_cpu_str(void); |
8 | 9 | ||
diff --git a/tools/perf/pmu-events/pmu-events.h b/tools/perf/pmu-events/pmu-events.h index 70d54794e3cb..2eaef595d8a0 100644 --- a/tools/perf/pmu-events/pmu-events.h +++ b/tools/perf/pmu-events/pmu-events.h | |||
@@ -9,6 +9,7 @@ struct pmu_event { | |||
9 | const char *event; | 9 | const char *event; |
10 | const char *desc; | 10 | const char *desc; |
11 | const char *topic; | 11 | const char *topic; |
12 | const char *long_desc; | ||
12 | }; | 13 | }; |
13 | 14 | ||
14 | /* | 15 | /* |