aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>2016-09-15 18:24:47 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2016-10-03 20:35:46 -0400
commit794ba54a8393456d503958d6217874e455b6a771 (patch)
treec104ac4fd8378a1fe88dd21e3757726d28a1e31e
parentfc06e2a5aad9fcf7efaabd7550ac31f648d2f2bc (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.c32
-rw-r--r--tools/perf/pmu-events/jevents.h3
-rw-r--r--tools/perf/pmu-events/pmu-events.h1
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
271static int print_events_table_entry(void *data, char *name, char *event, 271static 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 */
308int json_events(const char *fn, 310int 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
4int json_events(const char *fn, 4int 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);
7char *get_cpu_str(void); 8char *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/*