aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorRobert Richter <robert.richter@amd.com>2012-08-16 15:10:22 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2012-08-22 12:45:59 -0400
commit4e1b9c679fcb208275b55eb8fc46c2d58ef6a2ee (patch)
tree58edb6e9f43e285283d07c10800e348a84c53691 /tools
parentac2ba9f36bb400755e411309f3e76dbf308a10e7 (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.c134
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
1151static void print_event_desc(struct perf_header *ph, int fd, FILE *fp) 1151static 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
1168static struct perf_evsel *
1169read_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 }
1250out:
1251 if (buf)
1252 free(buf);
1253 return events;
1254error:
1255 if (events)
1256 free_event_desc(events);
1257 events = NULL;
1258 goto out;
1259}
1260
1261static 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);
1252error:
1253 fprintf(fp, "# event desc: not available or unable to read\n");
1254} 1306}
1255 1307
1256static void print_total_mem(struct perf_header *h __used, int fd, FILE *fp) 1308static void print_total_mem(struct perf_header *h __used, int fd, FILE *fp)