diff options
| author | Avi Kivity <avi@redhat.com> | 2011-12-25 08:44:43 -0500 |
|---|---|---|
| committer | Avi Kivity <avi@redhat.com> | 2011-12-27 04:22:24 -0500 |
| commit | 9e31905f293ae84e4f120ed9e414031eaefa0bdf (patch) | |
| tree | 153204ff0dca820e760007bc24075ec7fb46a276 /tools/perf/util/header.c | |
| parent | ff5c2c0316ff0e3e2dba3ca14167d994453df093 (diff) | |
| parent | b3d9468a8bd218a695e3a0ff112cd4efd27b670a (diff) | |
Merge remote-tracking branch 'tip/perf/core' into kvm-updates/3.3
* tip/perf/core: (66 commits)
perf, x86: Expose perf capability to other modules
perf, x86: Implement arch event mask as quirk
x86, perf: Disable non available architectural events
jump_label: Provide jump_label_key initializers
jump_label, x86: Fix section mismatch
perf, core: Rate limit perf_sched_events jump_label patching
perf: Fix enable_on_exec for sibling events
perf: Remove superfluous arguments
perf, x86: Prefer fixed-purpose counters when scheduling
perf, x86: Fix event scheduler for constraints with overlapping counters
perf, x86: Implement event scheduler helper functions
perf: Avoid a useless pmu_disable() in the perf-tick
x86/tools: Add decoded instruction dump mode
x86: Update instruction decoder to support new AVX formats
x86/tools: Fix insn_sanity message outputs
x86/tools: Fix instruction decoder message output
x86: Fix instruction decoder to handle grouped AVX instructions
x86/tools: Fix Makefile to build all test tools
perf test: Soft errors shouldn't stop the "Validate PERF_RECORD_" test
perf test: Validate PERF_RECORD_ events and perf_sample fields
...
Signed-off-by: Avi Kivity <avi@redhat.com>
* commit 'b3d9468a8bd218a695e3a0ff112cd4efd27b670a': (66 commits)
perf, x86: Expose perf capability to other modules
perf, x86: Implement arch event mask as quirk
x86, perf: Disable non available architectural events
jump_label: Provide jump_label_key initializers
jump_label, x86: Fix section mismatch
perf, core: Rate limit perf_sched_events jump_label patching
perf: Fix enable_on_exec for sibling events
perf: Remove superfluous arguments
perf, x86: Prefer fixed-purpose counters when scheduling
perf, x86: Fix event scheduler for constraints with overlapping counters
perf, x86: Implement event scheduler helper functions
perf: Avoid a useless pmu_disable() in the perf-tick
x86/tools: Add decoded instruction dump mode
x86: Update instruction decoder to support new AVX formats
x86/tools: Fix insn_sanity message outputs
x86/tools: Fix instruction decoder message output
x86: Fix instruction decoder to handle grouped AVX instructions
x86/tools: Fix Makefile to build all test tools
perf test: Soft errors shouldn't stop the "Validate PERF_RECORD_" test
perf test: Validate PERF_RECORD_ events and perf_sample fields
...
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, |
