diff options
Diffstat (limited to 'tools/perf/util/header.c')
-rw-r--r-- | tools/perf/util/header.c | 75 |
1 files changed, 39 insertions, 36 deletions
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 33c17a2b2a81..5b01449152ef 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c | |||
@@ -2041,6 +2041,8 @@ int perf_session__read_header(struct perf_session *session, int fd) | |||
2041 | lseek(fd, tmp, SEEK_SET); | 2041 | lseek(fd, tmp, SEEK_SET); |
2042 | } | 2042 | } |
2043 | 2043 | ||
2044 | symbol_conf.nr_events = nr_attrs; | ||
2045 | |||
2044 | if (f_header.event_types.size) { | 2046 | if (f_header.event_types.size) { |
2045 | lseek(fd, f_header.event_types.offset, SEEK_SET); | 2047 | lseek(fd, f_header.event_types.offset, SEEK_SET); |
2046 | events = malloc(f_header.event_types.size); | 2048 | events = malloc(f_header.event_types.size); |
@@ -2068,9 +2070,9 @@ out_delete_evlist: | |||
2068 | return -ENOMEM; | 2070 | return -ENOMEM; |
2069 | } | 2071 | } |
2070 | 2072 | ||
2071 | int perf_event__synthesize_attr(struct perf_event_attr *attr, u16 ids, u64 *id, | 2073 | int perf_event__synthesize_attr(struct perf_tool *tool, |
2072 | perf_event__handler_t process, | 2074 | struct perf_event_attr *attr, u16 ids, u64 *id, |
2073 | struct perf_session *session) | 2075 | perf_event__handler_t process) |
2074 | { | 2076 | { |
2075 | union perf_event *ev; | 2077 | union perf_event *ev; |
2076 | size_t size; | 2078 | size_t size; |
@@ -2092,22 +2094,23 @@ int perf_event__synthesize_attr(struct perf_event_attr *attr, u16 ids, u64 *id, | |||
2092 | ev->attr.header.type = PERF_RECORD_HEADER_ATTR; | 2094 | ev->attr.header.type = PERF_RECORD_HEADER_ATTR; |
2093 | ev->attr.header.size = size; | 2095 | ev->attr.header.size = size; |
2094 | 2096 | ||
2095 | err = process(ev, NULL, session); | 2097 | err = process(tool, ev, NULL, NULL); |
2096 | 2098 | ||
2097 | free(ev); | 2099 | free(ev); |
2098 | 2100 | ||
2099 | return err; | 2101 | return err; |
2100 | } | 2102 | } |
2101 | 2103 | ||
2102 | int perf_session__synthesize_attrs(struct perf_session *session, | 2104 | int perf_event__synthesize_attrs(struct perf_tool *tool, |
2105 | struct perf_session *session, | ||
2103 | perf_event__handler_t process) | 2106 | perf_event__handler_t process) |
2104 | { | 2107 | { |
2105 | struct perf_evsel *attr; | 2108 | struct perf_evsel *attr; |
2106 | int err = 0; | 2109 | int err = 0; |
2107 | 2110 | ||
2108 | list_for_each_entry(attr, &session->evlist->entries, node) { | 2111 | list_for_each_entry(attr, &session->evlist->entries, node) { |
2109 | err = perf_event__synthesize_attr(&attr->attr, attr->ids, | 2112 | err = perf_event__synthesize_attr(tool, &attr->attr, attr->ids, |
2110 | attr->id, process, session); | 2113 | attr->id, process); |
2111 | if (err) { | 2114 | if (err) { |
2112 | pr_debug("failed to create perf header attribute\n"); | 2115 | pr_debug("failed to create perf header attribute\n"); |
2113 | return err; | 2116 | return err; |
@@ -2118,23 +2121,23 @@ int perf_session__synthesize_attrs(struct perf_session *session, | |||
2118 | } | 2121 | } |
2119 | 2122 | ||
2120 | int perf_event__process_attr(union perf_event *event, | 2123 | int perf_event__process_attr(union perf_event *event, |
2121 | struct perf_session *session) | 2124 | struct perf_evlist **pevlist) |
2122 | { | 2125 | { |
2123 | unsigned int i, ids, n_ids; | 2126 | unsigned int i, ids, n_ids; |
2124 | struct perf_evsel *evsel; | 2127 | struct perf_evsel *evsel; |
2128 | struct perf_evlist *evlist = *pevlist; | ||
2125 | 2129 | ||
2126 | if (session->evlist == NULL) { | 2130 | if (evlist == NULL) { |
2127 | session->evlist = perf_evlist__new(NULL, NULL); | 2131 | *pevlist = evlist = perf_evlist__new(NULL, NULL); |
2128 | if (session->evlist == NULL) | 2132 | if (evlist == NULL) |
2129 | return -ENOMEM; | 2133 | return -ENOMEM; |
2130 | } | 2134 | } |
2131 | 2135 | ||
2132 | evsel = perf_evsel__new(&event->attr.attr, | 2136 | evsel = perf_evsel__new(&event->attr.attr, evlist->nr_entries); |
2133 | session->evlist->nr_entries); | ||
2134 | if (evsel == NULL) | 2137 | if (evsel == NULL) |
2135 | return -ENOMEM; | 2138 | return -ENOMEM; |
2136 | 2139 | ||
2137 | perf_evlist__add(session->evlist, evsel); | 2140 | perf_evlist__add(evlist, evsel); |
2138 | 2141 | ||
2139 | ids = event->header.size; | 2142 | ids = event->header.size; |
2140 | ids -= (void *)&event->attr.id - (void *)event; | 2143 | ids -= (void *)&event->attr.id - (void *)event; |
@@ -2148,18 +2151,16 @@ int perf_event__process_attr(union perf_event *event, | |||
2148 | return -ENOMEM; | 2151 | return -ENOMEM; |
2149 | 2152 | ||
2150 | for (i = 0; i < n_ids; i++) { | 2153 | for (i = 0; i < n_ids; i++) { |
2151 | perf_evlist__id_add(session->evlist, evsel, 0, i, | 2154 | perf_evlist__id_add(evlist, evsel, 0, i, event->attr.id[i]); |
2152 | event->attr.id[i]); | ||
2153 | } | 2155 | } |
2154 | 2156 | ||
2155 | perf_session__update_sample_type(session); | ||
2156 | |||
2157 | return 0; | 2157 | return 0; |
2158 | } | 2158 | } |
2159 | 2159 | ||
2160 | int perf_event__synthesize_event_type(u64 event_id, char *name, | 2160 | int perf_event__synthesize_event_type(struct perf_tool *tool, |
2161 | u64 event_id, char *name, | ||
2161 | perf_event__handler_t process, | 2162 | perf_event__handler_t process, |
2162 | struct perf_session *session) | 2163 | struct machine *machine) |
2163 | { | 2164 | { |
2164 | union perf_event ev; | 2165 | union perf_event ev; |
2165 | size_t size = 0; | 2166 | size_t size = 0; |
@@ -2177,13 +2178,14 @@ int perf_event__synthesize_event_type(u64 event_id, char *name, | |||
2177 | ev.event_type.header.size = sizeof(ev.event_type) - | 2178 | ev.event_type.header.size = sizeof(ev.event_type) - |
2178 | (sizeof(ev.event_type.event_type.name) - size); | 2179 | (sizeof(ev.event_type.event_type.name) - size); |
2179 | 2180 | ||
2180 | err = process(&ev, NULL, session); | 2181 | err = process(tool, &ev, NULL, machine); |
2181 | 2182 | ||
2182 | return err; | 2183 | return err; |
2183 | } | 2184 | } |
2184 | 2185 | ||
2185 | int perf_event__synthesize_event_types(perf_event__handler_t process, | 2186 | int perf_event__synthesize_event_types(struct perf_tool *tool, |
2186 | struct perf_session *session) | 2187 | perf_event__handler_t process, |
2188 | struct machine *machine) | ||
2187 | { | 2189 | { |
2188 | struct perf_trace_event_type *type; | 2190 | struct perf_trace_event_type *type; |
2189 | int i, err = 0; | 2191 | int i, err = 0; |
@@ -2191,9 +2193,9 @@ int perf_event__synthesize_event_types(perf_event__handler_t process, | |||
2191 | for (i = 0; i < event_count; i++) { | 2193 | for (i = 0; i < event_count; i++) { |
2192 | type = &events[i]; | 2194 | type = &events[i]; |
2193 | 2195 | ||
2194 | err = perf_event__synthesize_event_type(type->event_id, | 2196 | err = perf_event__synthesize_event_type(tool, type->event_id, |
2195 | type->name, process, | 2197 | type->name, process, |
2196 | session); | 2198 | machine); |
2197 | if (err) { | 2199 | if (err) { |
2198 | pr_debug("failed to create perf header event type\n"); | 2200 | pr_debug("failed to create perf header event type\n"); |
2199 | return err; | 2201 | return err; |
@@ -2203,8 +2205,8 @@ int perf_event__synthesize_event_types(perf_event__handler_t process, | |||
2203 | return err; | 2205 | return err; |
2204 | } | 2206 | } |
2205 | 2207 | ||
2206 | int perf_event__process_event_type(union perf_event *event, | 2208 | int perf_event__process_event_type(struct perf_tool *tool __unused, |
2207 | struct perf_session *session __unused) | 2209 | union perf_event *event) |
2208 | { | 2210 | { |
2209 | if (perf_header__push_event(event->event_type.event_type.event_id, | 2211 | if (perf_header__push_event(event->event_type.event_type.event_id, |
2210 | event->event_type.event_type.name) < 0) | 2212 | event->event_type.event_type.name) < 0) |
@@ -2213,9 +2215,9 @@ int perf_event__process_event_type(union perf_event *event, | |||
2213 | return 0; | 2215 | return 0; |
2214 | } | 2216 | } |
2215 | 2217 | ||
2216 | int perf_event__synthesize_tracing_data(int fd, struct perf_evlist *evlist, | 2218 | int perf_event__synthesize_tracing_data(struct perf_tool *tool, int fd, |
2217 | perf_event__handler_t process, | 2219 | struct perf_evlist *evlist, |
2218 | struct perf_session *session __unused) | 2220 | perf_event__handler_t process) |
2219 | { | 2221 | { |
2220 | union perf_event ev; | 2222 | union perf_event ev; |
2221 | struct tracing_data *tdata; | 2223 | struct tracing_data *tdata; |
@@ -2246,7 +2248,7 @@ int perf_event__synthesize_tracing_data(int fd, struct perf_evlist *evlist, | |||
2246 | ev.tracing_data.header.size = sizeof(ev.tracing_data); | 2248 | ev.tracing_data.header.size = sizeof(ev.tracing_data); |
2247 | ev.tracing_data.size = aligned_size; | 2249 | ev.tracing_data.size = aligned_size; |
2248 | 2250 | ||
2249 | process(&ev, NULL, session); | 2251 | process(tool, &ev, NULL, NULL); |
2250 | 2252 | ||
2251 | /* | 2253 | /* |
2252 | * The put function will copy all the tracing data | 2254 | * The put function will copy all the tracing data |
@@ -2288,10 +2290,10 @@ int perf_event__process_tracing_data(union perf_event *event, | |||
2288 | return size_read + padding; | 2290 | return size_read + padding; |
2289 | } | 2291 | } |
2290 | 2292 | ||
2291 | int perf_event__synthesize_build_id(struct dso *pos, u16 misc, | 2293 | int perf_event__synthesize_build_id(struct perf_tool *tool, |
2294 | struct dso *pos, u16 misc, | ||
2292 | perf_event__handler_t process, | 2295 | perf_event__handler_t process, |
2293 | struct machine *machine, | 2296 | struct machine *machine) |
2294 | struct perf_session *session) | ||
2295 | { | 2297 | { |
2296 | union perf_event ev; | 2298 | union perf_event ev; |
2297 | size_t len; | 2299 | size_t len; |
@@ -2311,12 +2313,13 @@ int perf_event__synthesize_build_id(struct dso *pos, u16 misc, | |||
2311 | ev.build_id.header.size = sizeof(ev.build_id) + len; | 2313 | ev.build_id.header.size = sizeof(ev.build_id) + len; |
2312 | memcpy(&ev.build_id.filename, pos->long_name, pos->long_name_len); | 2314 | memcpy(&ev.build_id.filename, pos->long_name, pos->long_name_len); |
2313 | 2315 | ||
2314 | err = process(&ev, NULL, session); | 2316 | err = process(tool, &ev, NULL, machine); |
2315 | 2317 | ||
2316 | return err; | 2318 | return err; |
2317 | } | 2319 | } |
2318 | 2320 | ||
2319 | int perf_event__process_build_id(union perf_event *event, | 2321 | int perf_event__process_build_id(struct perf_tool *tool __used, |
2322 | union perf_event *event, | ||
2320 | struct perf_session *session) | 2323 | struct perf_session *session) |
2321 | { | 2324 | { |
2322 | __event_process_build_id(&event->build_id, | 2325 | __event_process_build_id(&event->build_id, |