diff options
author | Robert Richter <robert.richter@amd.com> | 2012-08-16 15:10:22 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2012-08-22 12:45:59 -0400 |
commit | 4e1b9c679fcb208275b55eb8fc46c2d58ef6a2ee (patch) | |
tree | 58edb6e9f43e285283d07c10800e348a84c53691 /tools | |
parent | ac2ba9f36bb400755e411309f3e76dbf308a10e7 (diff) |
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: Robert 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.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/perf/util/header.c | 134 |
1 files changed, 93 insertions, 41 deletions
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 1e5b6aa60523..7454cf4eedb9 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c | |||
@@ -1148,12 +1148,29 @@ static void print_cpu_topology(struct perf_header *ph, int fd, FILE *fp) | |||
1148 | } | 1148 | } |
1149 | } | 1149 | } |
1150 | 1150 | ||
1151 | static void print_event_desc(struct perf_header *ph, int fd, FILE *fp) | 1151 | static void free_event_desc(struct perf_evsel *events) |
1152 | { | 1152 | { |
1153 | struct perf_event_attr attr; | 1153 | struct perf_evsel *evsel; |
1154 | uint64_t id; | 1154 | |
1155 | if (!events) | ||
1156 | return; | ||
1157 | |||
1158 | for (evsel = events; evsel->attr.size; evsel++) { | ||
1159 | if (evsel->name) | ||
1160 | free(evsel->name); | ||
1161 | if (evsel->id) | ||
1162 | free(evsel->id); | ||
1163 | } | ||
1164 | |||
1165 | free(events); | ||
1166 | } | ||
1167 | |||
1168 | static struct perf_evsel * | ||
1169 | read_event_desc(struct perf_header *ph, int fd) | ||
1170 | { | ||
1171 | struct perf_evsel *evsel, *events = NULL; | ||
1172 | u64 *id; | ||
1155 | void *buf = NULL; | 1173 | void *buf = NULL; |
1156 | char *str; | ||
1157 | u32 nre, sz, nr, i, j; | 1174 | u32 nre, sz, nr, i, j; |
1158 | ssize_t ret; | 1175 | ssize_t ret; |
1159 | size_t msz; | 1176 | size_t msz; |
@@ -1173,18 +1190,22 @@ static void print_event_desc(struct perf_header *ph, int fd, FILE *fp) | |||
1173 | if (ph->needs_swap) | 1190 | if (ph->needs_swap) |
1174 | sz = bswap_32(sz); | 1191 | sz = bswap_32(sz); |
1175 | 1192 | ||
1176 | memset(&attr, 0, sizeof(attr)); | ||
1177 | |||
1178 | /* buffer to hold on file attr struct */ | 1193 | /* buffer to hold on file attr struct */ |
1179 | buf = malloc(sz); | 1194 | buf = malloc(sz); |
1180 | if (!buf) | 1195 | if (!buf) |
1181 | goto error; | 1196 | goto error; |
1182 | 1197 | ||
1183 | msz = sizeof(attr); | 1198 | /* the last event terminates with evsel->attr.size == 0: */ |
1199 | events = calloc(nre + 1, sizeof(*events)); | ||
1200 | if (!events) | ||
1201 | goto error; | ||
1202 | |||
1203 | msz = sizeof(evsel->attr); | ||
1184 | if (sz < msz) | 1204 | if (sz < msz) |
1185 | msz = sz; | 1205 | msz = sz; |
1186 | 1206 | ||
1187 | for (i = 0 ; i < nre; i++) { | 1207 | for (i = 0, evsel = events; i < nre; evsel++, i++) { |
1208 | evsel->idx = i; | ||
1188 | 1209 | ||
1189 | /* | 1210 | /* |
1190 | * must read entire on-file attr struct to | 1211 | * 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 | if (ph->needs_swap) | 1218 | if (ph->needs_swap) |
1198 | perf_event__attr_swap(buf); | 1219 | perf_event__attr_swap(buf); |
1199 | 1220 | ||
1200 | memcpy(&attr, buf, msz); | 1221 | memcpy(&evsel->attr, buf, msz); |
1201 | 1222 | ||
1202 | ret = read(fd, &nr, sizeof(nr)); | 1223 | ret = read(fd, &nr, sizeof(nr)); |
1203 | if (ret != (ssize_t)sizeof(nr)) | 1224 | if (ret != (ssize_t)sizeof(nr)) |
@@ -1206,51 +1227,82 @@ static void print_event_desc(struct perf_header *ph, int fd, FILE *fp) | |||
1206 | if (ph->needs_swap) | 1227 | if (ph->needs_swap) |
1207 | nr = bswap_32(nr); | 1228 | nr = bswap_32(nr); |
1208 | 1229 | ||
1209 | str = do_read_string(fd, ph); | 1230 | evsel->name = do_read_string(fd, ph); |
1210 | fprintf(fp, "# event : name = %s, ", str); | 1231 | |
1211 | free(str); | 1232 | if (!nr) |
1233 | continue; | ||
1234 | |||
1235 | id = calloc(nr, sizeof(*id)); | ||
1236 | if (!id) | ||
1237 | goto error; | ||
1238 | evsel->ids = nr; | ||
1239 | evsel->id = id; | ||
1240 | |||
1241 | for (j = 0 ; j < nr; j++) { | ||
1242 | ret = read(fd, id, sizeof(*id)); | ||
1243 | if (ret != (ssize_t)sizeof(*id)) | ||
1244 | goto error; | ||
1245 | if (ph->needs_swap) | ||
1246 | *id = bswap_64(*id); | ||
1247 | id++; | ||
1248 | } | ||
1249 | } | ||
1250 | out: | ||
1251 | if (buf) | ||
1252 | free(buf); | ||
1253 | return events; | ||
1254 | error: | ||
1255 | if (events) | ||
1256 | free_event_desc(events); | ||
1257 | events = NULL; | ||
1258 | goto out; | ||
1259 | } | ||
1260 | |||
1261 | static void print_event_desc(struct perf_header *ph, int fd, FILE *fp) | ||
1262 | { | ||
1263 | struct perf_evsel *evsel, *events = read_event_desc(ph, fd); | ||
1264 | u32 j; | ||
1265 | u64 *id; | ||
1266 | |||
1267 | if (!events) { | ||
1268 | fprintf(fp, "# event desc: not available or unable to read\n"); | ||
1269 | return; | ||
1270 | } | ||
1271 | |||
1272 | for (evsel = events; evsel->attr.size; evsel++) { | ||
1273 | fprintf(fp, "# event : name = %s, ", evsel->name); | ||
1212 | 1274 | ||
1213 | fprintf(fp, "type = %d, config = 0x%"PRIx64 | 1275 | fprintf(fp, "type = %d, config = 0x%"PRIx64 |
1214 | ", config1 = 0x%"PRIx64", config2 = 0x%"PRIx64, | 1276 | ", config1 = 0x%"PRIx64", config2 = 0x%"PRIx64, |
1215 | attr.type, | 1277 | evsel->attr.type, |
1216 | (u64)attr.config, | 1278 | (u64)evsel->attr.config, |
1217 | (u64)attr.config1, | 1279 | (u64)evsel->attr.config1, |
1218 | (u64)attr.config2); | 1280 | (u64)evsel->attr.config2); |
1219 | 1281 | ||
1220 | fprintf(fp, ", excl_usr = %d, excl_kern = %d", | 1282 | fprintf(fp, ", excl_usr = %d, excl_kern = %d", |
1221 | attr.exclude_user, | 1283 | evsel->attr.exclude_user, |
1222 | attr.exclude_kernel); | 1284 | evsel->attr.exclude_kernel); |
1223 | 1285 | ||
1224 | fprintf(fp, ", excl_host = %d, excl_guest = %d", | 1286 | fprintf(fp, ", excl_host = %d, excl_guest = %d", |
1225 | attr.exclude_host, | 1287 | evsel->attr.exclude_host, |
1226 | attr.exclude_guest); | 1288 | evsel->attr.exclude_guest); |
1227 | 1289 | ||
1228 | fprintf(fp, ", precise_ip = %d", attr.precise_ip); | 1290 | fprintf(fp, ", precise_ip = %d", evsel->attr.precise_ip); |
1229 | 1291 | ||
1230 | if (nr) | 1292 | if (evsel->ids) { |
1231 | fprintf(fp, ", id = {"); | 1293 | fprintf(fp, ", id = {"); |
1232 | 1294 | for (j = 0, id = evsel->id; j < evsel->ids; j++, id++) { | |
1233 | for (j = 0 ; j < nr; j++) { | 1295 | if (j) |
1234 | ret = read(fd, &id, sizeof(id)); | 1296 | fputc(',', fp); |
1235 | if (ret != (ssize_t)sizeof(id)) | 1297 | fprintf(fp, " %"PRIu64, *id); |
1236 | goto error; | 1298 | } |
1237 | |||
1238 | if (ph->needs_swap) | ||
1239 | id = bswap_64(id); | ||
1240 | |||
1241 | if (j) | ||
1242 | fputc(',', fp); | ||
1243 | |||
1244 | fprintf(fp, " %"PRIu64, id); | ||
1245 | } | ||
1246 | if (nr && j == nr) | ||
1247 | fprintf(fp, " }"); | 1299 | fprintf(fp, " }"); |
1300 | } | ||
1301 | |||
1248 | fputc('\n', fp); | 1302 | fputc('\n', fp); |
1249 | } | 1303 | } |
1250 | free(buf); | 1304 | |
1251 | return; | 1305 | free_event_desc(events); |
1252 | error: | ||
1253 | fprintf(fp, "# event desc: not available or unable to read\n"); | ||
1254 | } | 1306 | } |
1255 | 1307 | ||
1256 | static void print_total_mem(struct perf_header *h __used, int fd, FILE *fp) | 1308 | static void print_total_mem(struct perf_header *h __used, int fd, FILE *fp) |