Commit 4e1b9c67 authored by Robert Richter's avatar Robert Richter Committed by Arnaldo Carvalho de Melo

perf tools: Refactor print_event_desc()

For later use we need a function read_event_desc() for processing the
event_desc feature. Split it from print_event_desc().
Signed-off-by: default avatarRobert Richter <robert.richter@amd.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/1345144224-27280-7-git-send-email-robert.richter@amd.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent ac2ba9f3
...@@ -1148,12 +1148,29 @@ static void print_cpu_topology(struct perf_header *ph, int fd, FILE *fp) ...@@ -1148,12 +1148,29 @@ static void print_cpu_topology(struct perf_header *ph, int fd, FILE *fp)
} }
} }
static void print_event_desc(struct perf_header *ph, int fd, FILE *fp) static void free_event_desc(struct perf_evsel *events)
{ {
struct perf_event_attr attr; struct perf_evsel *evsel;
uint64_t id;
if (!events)
return;
for (evsel = events; evsel->attr.size; evsel++) {
if (evsel->name)
free(evsel->name);
if (evsel->id)
free(evsel->id);
}
free(events);
}
static struct perf_evsel *
read_event_desc(struct perf_header *ph, int fd)
{
struct perf_evsel *evsel, *events = NULL;
u64 *id;
void *buf = NULL; void *buf = NULL;
char *str;
u32 nre, sz, nr, i, j; u32 nre, sz, nr, i, j;
ssize_t ret; ssize_t ret;
size_t msz; size_t msz;
...@@ -1173,18 +1190,22 @@ static void print_event_desc(struct perf_header *ph, int fd, FILE *fp) ...@@ -1173,18 +1190,22 @@ static void print_event_desc(struct perf_header *ph, int fd, FILE *fp)
if (ph->needs_swap) if (ph->needs_swap)
sz = bswap_32(sz); sz = bswap_32(sz);
memset(&attr, 0, sizeof(attr));
/* buffer to hold on file attr struct */ /* buffer to hold on file attr struct */
buf = malloc(sz); buf = malloc(sz);
if (!buf) if (!buf)
goto error; goto error;
msz = sizeof(attr); /* the last event terminates with evsel->attr.size == 0: */
events = calloc(nre + 1, sizeof(*events));
if (!events)
goto error;
msz = sizeof(evsel->attr);
if (sz < msz) if (sz < msz)
msz = sz; msz = sz;
for (i = 0 ; i < nre; i++) { for (i = 0, evsel = events; i < nre; evsel++, i++) {
evsel->idx = i;
/* /*
* must read entire on-file attr struct to * must read entire on-file attr struct to
...@@ -1197,7 +1218,7 @@ static void print_event_desc(struct perf_header *ph, int fd, FILE *fp) ...@@ -1197,7 +1218,7 @@ static void print_event_desc(struct perf_header *ph, int fd, FILE *fp)
if (ph->needs_swap) if (ph->needs_swap)
perf_event__attr_swap(buf); perf_event__attr_swap(buf);
memcpy(&attr, buf, msz); memcpy(&evsel->attr, buf, msz);
ret = read(fd, &nr, sizeof(nr)); ret = read(fd, &nr, sizeof(nr));
if (ret != (ssize_t)sizeof(nr)) if (ret != (ssize_t)sizeof(nr))
...@@ -1206,51 +1227,82 @@ static void print_event_desc(struct perf_header *ph, int fd, FILE *fp) ...@@ -1206,51 +1227,82 @@ static void print_event_desc(struct perf_header *ph, int fd, FILE *fp)
if (ph->needs_swap) if (ph->needs_swap)
nr = bswap_32(nr); nr = bswap_32(nr);
str = do_read_string(fd, ph); evsel->name = do_read_string(fd, ph);
fprintf(fp, "# event : name = %s, ", str);
free(str); if (!nr)
continue;
id = calloc(nr, sizeof(*id));
if (!id)
goto error;
evsel->ids = nr;
evsel->id = id;
for (j = 0 ; j < nr; j++) {
ret = read(fd, id, sizeof(*id));
if (ret != (ssize_t)sizeof(*id))
goto error;
if (ph->needs_swap)
*id = bswap_64(*id);
id++;
}
}
out:
if (buf)
free(buf);
return events;
error:
if (events)
free_event_desc(events);
events = NULL;
goto out;
}
static void print_event_desc(struct perf_header *ph, int fd, FILE *fp)
{
struct perf_evsel *evsel, *events = read_event_desc(ph, fd);
u32 j;
u64 *id;
if (!events) {
fprintf(fp, "# event desc: not available or unable to read\n");
return;
}
for (evsel = events; evsel->attr.size; evsel++) {
fprintf(fp, "# event : name = %s, ", evsel->name);
fprintf(fp, "type = %d, config = 0x%"PRIx64 fprintf(fp, "type = %d, config = 0x%"PRIx64
", config1 = 0x%"PRIx64", config2 = 0x%"PRIx64, ", config1 = 0x%"PRIx64", config2 = 0x%"PRIx64,
attr.type, evsel->attr.type,
(u64)attr.config, (u64)evsel->attr.config,
(u64)attr.config1, (u64)evsel->attr.config1,
(u64)attr.config2); (u64)evsel->attr.config2);
fprintf(fp, ", excl_usr = %d, excl_kern = %d", fprintf(fp, ", excl_usr = %d, excl_kern = %d",
attr.exclude_user, evsel->attr.exclude_user,
attr.exclude_kernel); evsel->attr.exclude_kernel);
fprintf(fp, ", excl_host = %d, excl_guest = %d", fprintf(fp, ", excl_host = %d, excl_guest = %d",
attr.exclude_host, evsel->attr.exclude_host,
attr.exclude_guest); evsel->attr.exclude_guest);
fprintf(fp, ", precise_ip = %d", attr.precise_ip); fprintf(fp, ", precise_ip = %d", evsel->attr.precise_ip);
if (nr) if (evsel->ids) {
fprintf(fp, ", id = {"); fprintf(fp, ", id = {");
for (j = 0, id = evsel->id; j < evsel->ids; j++, id++) {
for (j = 0 ; j < nr; j++) { if (j)
ret = read(fd, &id, sizeof(id)); fputc(',', fp);
if (ret != (ssize_t)sizeof(id)) fprintf(fp, " %"PRIu64, *id);
goto error; }
if (ph->needs_swap)
id = bswap_64(id);
if (j)
fputc(',', fp);
fprintf(fp, " %"PRIu64, id);
}
if (nr && j == nr)
fprintf(fp, " }"); fprintf(fp, " }");
}
fputc('\n', fp); fputc('\n', fp);
} }
free(buf);
return; free_event_desc(events);
error:
fprintf(fp, "# event desc: not available or unable to read\n");
} }
static void print_total_mem(struct perf_header *h __used, int fd, FILE *fp) static void print_total_mem(struct perf_header *h __used, int fd, FILE *fp)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment