diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-11-07 15:38:11 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-11-07 15:38:11 -0500 |
| commit | 54a0f91301950af3d6ae2ff2bf710c9c68a9bfea (patch) | |
| tree | ffcdf0b916f9c5f805cab347e53b60be17c9aead | |
| parent | 94956eed14b4b16d401c8ad36d68df0608f968cb (diff) | |
| parent | f9e3d4b1a9c86217655997d3ef109b1eaae967bc (diff) | |
Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
perf top: Fix live annotation in the --stdio interface
perf top tui: Don't recalc column widths considering just the first page
perf report: Add progress bar when processing time ordered events
perf hists browser: Warn about lost events
perf tools: Fix a typo of command name as trace-cmd
perf hists: Fix recalculation of total_period when sorting entries
perf header: Fix build on old systems
perf ui browser: Handle K_RESIZE in dialog windows
perf ui browser: No need to switch char sets that often
perf hists browser: Use K_TIMER
perf ui: Rename ui__warning_paranoid to ui__error_paranoid
perf ui: Reimplement the popup windows using libslang
perf ui: Reimplement ui__popup_menu using ui__browser
perf ui: Reimplement ui_helpline using libslang
perf ui: Improve handling sigwinch a bit
perf ui progress: Reimplement using slang
perf evlist: Fix grouping of multiple events
31 files changed, 624 insertions, 288 deletions
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index f82480fa7f27..6ab58cc99d53 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c | |||
| @@ -262,13 +262,16 @@ static bool perf_evlist__equal(struct perf_evlist *evlist, | |||
| 262 | 262 | ||
| 263 | static void open_counters(struct perf_evlist *evlist) | 263 | static void open_counters(struct perf_evlist *evlist) |
| 264 | { | 264 | { |
| 265 | struct perf_evsel *pos; | 265 | struct perf_evsel *pos, *first; |
| 266 | 266 | ||
| 267 | if (evlist->cpus->map[0] < 0) | 267 | if (evlist->cpus->map[0] < 0) |
| 268 | no_inherit = true; | 268 | no_inherit = true; |
| 269 | 269 | ||
| 270 | first = list_entry(evlist->entries.next, struct perf_evsel, node); | ||
| 271 | |||
| 270 | list_for_each_entry(pos, &evlist->entries, node) { | 272 | list_for_each_entry(pos, &evlist->entries, node) { |
| 271 | struct perf_event_attr *attr = &pos->attr; | 273 | struct perf_event_attr *attr = &pos->attr; |
| 274 | struct xyarray *group_fd = NULL; | ||
| 272 | /* | 275 | /* |
| 273 | * Check if parse_single_tracepoint_event has already asked for | 276 | * Check if parse_single_tracepoint_event has already asked for |
| 274 | * PERF_SAMPLE_TIME. | 277 | * PERF_SAMPLE_TIME. |
| @@ -283,15 +286,19 @@ static void open_counters(struct perf_evlist *evlist) | |||
| 283 | */ | 286 | */ |
| 284 | bool time_needed = attr->sample_type & PERF_SAMPLE_TIME; | 287 | bool time_needed = attr->sample_type & PERF_SAMPLE_TIME; |
| 285 | 288 | ||
| 289 | if (group && pos != first) | ||
| 290 | group_fd = first->fd; | ||
| 291 | |||
| 286 | config_attr(pos, evlist); | 292 | config_attr(pos, evlist); |
| 287 | retry_sample_id: | 293 | retry_sample_id: |
| 288 | attr->sample_id_all = sample_id_all_avail ? 1 : 0; | 294 | attr->sample_id_all = sample_id_all_avail ? 1 : 0; |
| 289 | try_again: | 295 | try_again: |
| 290 | if (perf_evsel__open(pos, evlist->cpus, evlist->threads, group) < 0) { | 296 | if (perf_evsel__open(pos, evlist->cpus, evlist->threads, group, |
| 297 | group_fd) < 0) { | ||
| 291 | int err = errno; | 298 | int err = errno; |
| 292 | 299 | ||
| 293 | if (err == EPERM || err == EACCES) { | 300 | if (err == EPERM || err == EACCES) { |
| 294 | ui__warning_paranoid(); | 301 | ui__error_paranoid(); |
| 295 | exit(EXIT_FAILURE); | 302 | exit(EXIT_FAILURE); |
| 296 | } else if (err == ENODEV && cpu_list) { | 303 | } else if (err == ENODEV && cpu_list) { |
| 297 | die("No such device - did you specify" | 304 | die("No such device - did you specify" |
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 7ce65f52415e..7d98676808d8 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c | |||
| @@ -278,9 +278,14 @@ struct stats runtime_itlb_cache_stats[MAX_NR_CPUS]; | |||
| 278 | struct stats runtime_dtlb_cache_stats[MAX_NR_CPUS]; | 278 | struct stats runtime_dtlb_cache_stats[MAX_NR_CPUS]; |
| 279 | struct stats walltime_nsecs_stats; | 279 | struct stats walltime_nsecs_stats; |
| 280 | 280 | ||
| 281 | static int create_perf_stat_counter(struct perf_evsel *evsel) | 281 | static int create_perf_stat_counter(struct perf_evsel *evsel, |
| 282 | struct perf_evsel *first) | ||
| 282 | { | 283 | { |
| 283 | struct perf_event_attr *attr = &evsel->attr; | 284 | struct perf_event_attr *attr = &evsel->attr; |
| 285 | struct xyarray *group_fd = NULL; | ||
| 286 | |||
| 287 | if (group && evsel != first) | ||
| 288 | group_fd = first->fd; | ||
| 284 | 289 | ||
| 285 | if (scale) | 290 | if (scale) |
| 286 | attr->read_format = PERF_FORMAT_TOTAL_TIME_ENABLED | | 291 | attr->read_format = PERF_FORMAT_TOTAL_TIME_ENABLED | |
| @@ -289,14 +294,15 @@ static int create_perf_stat_counter(struct perf_evsel *evsel) | |||
| 289 | attr->inherit = !no_inherit; | 294 | attr->inherit = !no_inherit; |
| 290 | 295 | ||
| 291 | if (system_wide) | 296 | if (system_wide) |
| 292 | return perf_evsel__open_per_cpu(evsel, evsel_list->cpus, group); | 297 | return perf_evsel__open_per_cpu(evsel, evsel_list->cpus, |
| 293 | 298 | group, group_fd); | |
| 294 | if (target_pid == -1 && target_tid == -1) { | 299 | if (target_pid == -1 && target_tid == -1) { |
| 295 | attr->disabled = 1; | 300 | attr->disabled = 1; |
| 296 | attr->enable_on_exec = 1; | 301 | attr->enable_on_exec = 1; |
| 297 | } | 302 | } |
| 298 | 303 | ||
| 299 | return perf_evsel__open_per_thread(evsel, evsel_list->threads, group); | 304 | return perf_evsel__open_per_thread(evsel, evsel_list->threads, |
| 305 | group, group_fd); | ||
| 300 | } | 306 | } |
| 301 | 307 | ||
| 302 | /* | 308 | /* |
| @@ -396,7 +402,7 @@ static int read_counter(struct perf_evsel *counter) | |||
| 396 | static int run_perf_stat(int argc __used, const char **argv) | 402 | static int run_perf_stat(int argc __used, const char **argv) |
| 397 | { | 403 | { |
| 398 | unsigned long long t0, t1; | 404 | unsigned long long t0, t1; |
| 399 | struct perf_evsel *counter; | 405 | struct perf_evsel *counter, *first; |
| 400 | int status = 0; | 406 | int status = 0; |
| 401 | int child_ready_pipe[2], go_pipe[2]; | 407 | int child_ready_pipe[2], go_pipe[2]; |
| 402 | const bool forks = (argc > 0); | 408 | const bool forks = (argc > 0); |
| @@ -453,8 +459,10 @@ static int run_perf_stat(int argc __used, const char **argv) | |||
| 453 | close(child_ready_pipe[0]); | 459 | close(child_ready_pipe[0]); |
| 454 | } | 460 | } |
| 455 | 461 | ||
| 462 | first = list_entry(evsel_list->entries.next, struct perf_evsel, node); | ||
| 463 | |||
| 456 | list_for_each_entry(counter, &evsel_list->entries, node) { | 464 | list_for_each_entry(counter, &evsel_list->entries, node) { |
| 457 | if (create_perf_stat_counter(counter) < 0) { | 465 | if (create_perf_stat_counter(counter, first) < 0) { |
| 458 | if (errno == EINVAL || errno == ENOSYS || errno == ENOENT) { | 466 | if (errno == EINVAL || errno == ENOSYS || errno == ENOENT) { |
| 459 | if (verbose) | 467 | if (verbose) |
| 460 | ui__warning("%s event is not supported by the kernel.\n", | 468 | ui__warning("%s event is not supported by the kernel.\n", |
diff --git a/tools/perf/builtin-test.c b/tools/perf/builtin-test.c index efe696f936e2..831d1baeac37 100644 --- a/tools/perf/builtin-test.c +++ b/tools/perf/builtin-test.c | |||
| @@ -291,7 +291,7 @@ static int test__open_syscall_event(void) | |||
| 291 | goto out_thread_map_delete; | 291 | goto out_thread_map_delete; |
| 292 | } | 292 | } |
| 293 | 293 | ||
| 294 | if (perf_evsel__open_per_thread(evsel, threads, false) < 0) { | 294 | if (perf_evsel__open_per_thread(evsel, threads, false, NULL) < 0) { |
| 295 | pr_debug("failed to open counter: %s, " | 295 | pr_debug("failed to open counter: %s, " |
| 296 | "tweak /proc/sys/kernel/perf_event_paranoid?\n", | 296 | "tweak /proc/sys/kernel/perf_event_paranoid?\n", |
| 297 | strerror(errno)); | 297 | strerror(errno)); |
| @@ -366,7 +366,7 @@ static int test__open_syscall_event_on_all_cpus(void) | |||
| 366 | goto out_thread_map_delete; | 366 | |
