diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-12 21:20:11 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-12 21:20:11 -0400 |
commit | ade0899b298ba2c43bfd6abd8cbc2545944cde0c (patch) | |
tree | a448dfb440b3b958b6306bb43620cd5d76f504bf /tools/perf/util/evlist.c | |
parent | 871a0596cb2f51b57dc583d1a7c4be0186582fe7 (diff) | |
parent | 95cf59ea72331d0093010543b8951bb43f262cac (diff) |
Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull perf updates from Ingo Molnar:
"This tree includes some late late perf items that missed the first
round:
tools:
- Bash auto completion improvements, now we can auto complete the
tools long options, tracepoint event names, etc, from Namhyung Kim.
- Look up thread using tid instead of pid in 'perf sched'.
- Move global variables into a perf_kvm struct, from David Ahern.
- Hists refactorings, preparatory for improved 'diff' command, from
Jiri Olsa.
- Hists refactorings, preparatory for event group viewieng work, from
Namhyung Kim.
- Remove double negation on optional feature macro definitions, from
Namhyung Kim.
- Remove several cases of needless global variables, on most
builtins.
- misc fixes
kernel:
- sysfs support for IBS on AMD CPUs, from Robert Richter.
- Support for an upcoming Intel CPU, the Xeon-Phi / Knights Corner
HPC blade PMU, from Vince Weaver.
- misc fixes"
* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (46 commits)
perf: Fix perf_cgroup_switch for sw-events
perf: Clarify perf_cpu_context::active_pmu usage by renaming it to ::unique_pmu
perf/AMD/IBS: Add sysfs support
perf hists: Add more helpers for hist entry stat
perf hists: Move he->stat.nr_events initialization to a template
perf hists: Introduce struct he_stat
perf diff: Removing the total_period argument from output code
perf tool: Add hpp interface to enable/disable hpp column
perf tools: Removing hists pair argument from output path
perf hists: Separate overhead and baseline columns
perf diff: Refactor diff displacement possition info
perf hists: Add struct hists pointer to struct hist_entry
perf tools: Complete tracepoint event names
perf/x86: Add support for Intel Xeon-Phi Knights Corner PMU
perf evlist: Remove some unused methods
perf evlist: Introduce add_newtp method
perf kvm: Move global variables into a perf_kvm struct
perf tools: Convert to BACKTRACE_SUPPORT
perf tools: Long option completion support for each subcommands
perf tools: Complete long option names of perf command
...
Diffstat (limited to 'tools/perf/util/evlist.c')
-rw-r--r-- | tools/perf/util/evlist.c | 88 |
1 files changed, 10 insertions, 78 deletions
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index ae89686102f4..186b87730396 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c | |||
@@ -154,8 +154,8 @@ error: | |||
154 | return -ENOMEM; | 154 | return -ENOMEM; |
155 | } | 155 | } |
156 | 156 | ||
157 | int perf_evlist__add_attrs(struct perf_evlist *evlist, | 157 | static int perf_evlist__add_attrs(struct perf_evlist *evlist, |
158 | struct perf_event_attr *attrs, size_t nr_attrs) | 158 | struct perf_event_attr *attrs, size_t nr_attrs) |
159 | { | 159 | { |
160 | struct perf_evsel *evsel, *n; | 160 | struct perf_evsel *evsel, *n; |
161 | LIST_HEAD(head); | 161 | LIST_HEAD(head); |
@@ -189,60 +189,6 @@ int __perf_evlist__add_default_attrs(struct perf_evlist *evlist, | |||
189 | return perf_evlist__add_attrs(evlist, attrs, nr_attrs); | 189 | return perf_evlist__add_attrs(evlist, attrs, nr_attrs); |
190 | } | 190 | } |
191 | 191 | ||
192 | static int trace_event__id(const char *evname) | ||
193 | { | ||
194 | char *filename, *colon; | ||
195 | int err = -1, fd; | ||
196 | |||
197 | if (asprintf(&filename, "%s/%s/id", tracing_events_path, evname) < 0) | ||
198 | return -1; | ||
199 | |||
200 | colon = strrchr(filename, ':'); | ||
201 | if (colon != NULL) | ||
202 | *colon = '/'; | ||
203 | |||
204 | fd = open(filename, O_RDONLY); | ||
205 | if (fd >= 0) { | ||
206 | char id[16]; | ||
207 | if (read(fd, id, sizeof(id)) > 0) | ||
208 | err = atoi(id); | ||
209 | close(fd); | ||
210 | } | ||
211 | |||
212 | free(filename); | ||
213 | return err; | ||
214 | } | ||
215 | |||
216 | int perf_evlist__add_tracepoints(struct perf_evlist *evlist, | ||
217 | const char *tracepoints[], | ||
218 | size_t nr_tracepoints) | ||
219 | { | ||
220 | int err; | ||
221 | size_t i; | ||
222 | struct perf_event_attr *attrs = zalloc(nr_tracepoints * sizeof(*attrs)); | ||
223 | |||
224 | if (attrs == NULL) | ||
225 | return -1; | ||
226 | |||
227 | for (i = 0; i < nr_tracepoints; i++) { | ||
228 | err = trace_event__id(tracepoints[i]); | ||
229 | |||
230 | if (err < 0) | ||
231 | goto out_free_attrs; | ||
232 | |||
233 | attrs[i].type = PERF_TYPE_TRACEPOINT; | ||
234 | attrs[i].config = err; | ||
235 | attrs[i].sample_type = (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | | ||
236 | PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD); | ||
237 | attrs[i].sample_period = 1; | ||
238 | } | ||
239 | |||
240 | err = perf_evlist__add_attrs(evlist, attrs, nr_tracepoints); | ||
241 | out_free_attrs: | ||
242 | free(attrs); | ||
243 | return err; | ||
244 | } | ||
245 | |||
246 | struct perf_evsel * | 192 | struct perf_evsel * |
247 | perf_evlist__find_tracepoint_by_id(struct perf_evlist *evlist, int id) | 193 | perf_evlist__find_tracepoint_by_id(struct perf_evlist *evlist, int id) |
248 | { | 194 | { |
@@ -257,32 +203,18 @@ perf_evlist__find_tracepoint_by_id(struct perf_evlist *evlist, int id) | |||
257 | return NULL; | 203 | return NULL; |
258 | } | 204 | } |
259 | 205 | ||
260 | int perf_evlist__set_tracepoints_handlers(struct perf_evlist *evlist, | 206 | int perf_evlist__add_newtp(struct perf_evlist *evlist, |
261 | const struct perf_evsel_str_handler *assocs, | 207 | const char *sys, const char *name, void *handler) |
262 | size_t nr_assocs) | ||
263 | { | 208 | { |
264 | struct perf_evsel *evsel; | 209 | struct perf_evsel *evsel; |
265 | int err; | ||
266 | size_t i; | ||
267 | |||
268 | for (i = 0; i < nr_assocs; i++) { | ||
269 | err = trace_event__id(assocs[i].name); | ||
270 | if (err < 0) | ||
271 | goto out; | ||
272 | |||
273 | evsel = perf_evlist__find_tracepoint_by_id(evlist, err); | ||
274 | if (evsel == NULL) | ||
275 | continue; | ||
276 | 210 | ||
277 | err = -EEXIST; | 211 | evsel = perf_evsel__newtp(sys, name, evlist->nr_entries); |
278 | if (evsel->handler.func != NULL) | 212 | if (evsel == NULL) |
279 | goto out; | 213 | return -1; |
280 | evsel->handler.func = assocs[i].handler; | ||
281 | } | ||
282 | 214 | ||
283 | err = 0; | 215 | evsel->handler.func = handler; |
284 | out: | 216 | perf_evlist__add(evlist, evsel); |
285 | return err; | 217 | return 0; |
286 | } | 218 | } |
287 | 219 | ||
288 | void perf_evlist__disable(struct perf_evlist *evlist) | 220 | void perf_evlist__disable(struct perf_evlist *evlist) |