diff options
| author | Ingo Molnar <mingo@elte.hu> | 2011-08-10 04:20:52 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2011-08-10 04:20:52 -0400 |
| commit | 7676ebbaf21c3828e6315baadb6fcde448aa79b4 (patch) | |
| tree | f940029a96b3d82b84a4433d1e2b917ff1d2b166 | |
| parent | e710574de10b181c159a67af75af0245de33a4b9 (diff) | |
| parent | 981c1252691f4b855f2bb47ea93fb6052ea3aee2 (diff) | |
Merge branch 'perf/core' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent
| -rw-r--r-- | tools/perf/builtin-sched.c | 24 | ||||
| -rw-r--r-- | tools/perf/util/config.c | 27 | ||||
| -rw-r--r-- | tools/perf/util/symbol.c | 11 |
3 files changed, 50 insertions, 12 deletions
diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index dcfe8873c9a1..5177964943e7 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c | |||
| @@ -1637,23 +1637,29 @@ static struct perf_event_ops event_ops = { | |||
| 1637 | .ordered_samples = true, | 1637 | .ordered_samples = true, |
| 1638 | }; | 1638 | }; |
| 1639 | 1639 | ||
| 1640 | static int read_events(void) | 1640 | static void read_events(bool destroy, struct perf_session **psession) |
| 1641 | { | 1641 | { |
| 1642 | int err = -EINVAL; | 1642 | int err = -EINVAL; |
| 1643 | struct perf_session *session = perf_session__new(input_name, O_RDONLY, | 1643 | struct perf_session *session = perf_session__new(input_name, O_RDONLY, |
| 1644 | 0, false, &event_ops); | 1644 | 0, false, &event_ops); |
| 1645 | if (session == NULL) | 1645 | if (session == NULL) |
| 1646 | return -ENOMEM; | 1646 | die("No Memory"); |
| 1647 | 1647 | ||
| 1648 | if (perf_session__has_traces(session, "record -R")) { | 1648 | if (perf_session__has_traces(session, "record -R")) { |
| 1649 | err = perf_session__process_events(session, &event_ops); | 1649 | err = perf_session__process_events(session, &event_ops); |
| 1650 | if (err) | ||
| 1651 | die("Failed to process events, error %d", err); | ||
| 1652 | |||
| 1650 | nr_events = session->hists.stats.nr_events[0]; | 1653 | nr_events = session->hists.stats.nr_events[0]; |
| 1651 | nr_lost_events = session->hists.stats.total_lost; | 1654 | nr_lost_events = session->hists.stats.total_lost; |
| 1652 | nr_lost_chunks = session->hists.stats.nr_events[PERF_RECORD_LOST]; | 1655 | nr_lost_chunks = session->hists.stats.nr_events[PERF_RECORD_LOST]; |
| 1653 | } | 1656 | } |
| 1654 | 1657 | ||
| 1655 | perf_session__delete(session); | 1658 | if (destroy) |
| 1656 | return err; | 1659 | perf_session__delete(session); |
| 1660 | |||
| 1661 | if (psession) | ||
| 1662 | *psession = session; | ||
| 1657 | } | 1663 | } |
| 1658 | 1664 | ||
| 1659 | static void print_bad_events(void) | 1665 | static void print_bad_events(void) |
| @@ -1689,9 +1695,10 @@ static void print_bad_events(void) | |||
| 1689 | static void __cmd_lat(void) | 1695 | static void __cmd_lat(void) |
| 1690 | { | 1696 | { |
| 1691 | struct rb_node *next; | 1697 | struct rb_node *next; |
| 1698 | struct perf_session *session; | ||
| 1692 | 1699 | ||
| 1693 | setup_pager(); | 1700 | setup_pager(); |
| 1694 | read_events(); | 1701 | read_events(false, &session); |
| 1695 | sort_lat(); | 1702 | sort_lat(); |
| 1696 | 1703 | ||
| 1697 | printf("\n ---------------------------------------------------------------------------------------------------------------\n"); | 1704 | printf("\n ---------------------------------------------------------------------------------------------------------------\n"); |
| @@ -1717,6 +1724,7 @@ static void __cmd_lat(void) | |||
| 1717 | print_bad_events(); | 1724 | print_bad_events(); |
| 1718 | printf("\n"); | 1725 | printf("\n"); |
| 1719 | 1726 | ||
| 1727 | perf_session__delete(session); | ||
| 1720 | } | 1728 | } |
| 1721 | 1729 | ||
| 1722 | static struct trace_sched_handler map_ops = { | 1730 | static struct trace_sched_handler map_ops = { |
| @@ -1731,7 +1739,7 @@ static void __cmd_map(void) | |||
| 1731 | max_cpu = sysconf(_SC_NPROCESSORS_CONF); | 1739 | max_cpu = sysconf(_SC_NPROCESSORS_CONF); |
| 1732 | 1740 | ||
| 1733 | setup_pager(); | 1741 | setup_pager(); |
| 1734 | read_events(); | 1742 | read_events(true, NULL); |
| 1735 | print_bad_events(); | 1743 | print_bad_events(); |
| 1736 | } | 1744 | } |
| 1737 | 1745 | ||
| @@ -1744,7 +1752,7 @@ static void __cmd_replay(void) | |||
| 1744 | 1752 | ||
| 1745 | test_calibrations(); | 1753 | test_calibrations(); |
| 1746 | 1754 | ||
| 1747 | read_events(); | 1755 | read_events(true, NULL); |
| 1748 | 1756 | ||
| 1749 | printf("nr_run_events: %ld\n", nr_run_events); | 1757 | printf("nr_run_events: %ld\n", nr_run_events); |
| 1750 | printf("nr_sleep_events: %ld\n", nr_sleep_events); | 1758 | printf("nr_sleep_events: %ld\n", nr_sleep_events); |
| @@ -1769,7 +1777,7 @@ static void __cmd_replay(void) | |||
| 1769 | 1777 | ||
| 1770 | 1778 | ||
| 1771 | static const char * const sched_usage[] = { | 1779 | static const char * const sched_usage[] = { |
| 1772 | "perf sched [<options>] {record|latency|map|replay|trace}", | 1780 | "perf sched [<options>] {record|latency|map|replay|script}", |
| 1773 | NULL | 1781 | NULL |
| 1774 | }; | 1782 | }; |
| 1775 | 1783 | ||
diff --git a/tools/perf/util/config.c b/tools/perf/util/config.c index 6c86eca8b1b7..fe02903f7d0f 100644 --- a/tools/perf/util/config.c +++ b/tools/perf/util/config.c | |||
| @@ -413,13 +413,32 @@ int perf_config(config_fn_t fn, void *data) | |||
| 413 | home = getenv("HOME"); | 413 | home = getenv("HOME"); |
| 414 | if (perf_config_global() && home) { | 414 | if (perf_config_global() && home) { |
| 415 | char *user_config = strdup(mkpath("%s/.perfconfig", home)); | 415 | char *user_config = strdup(mkpath("%s/.perfconfig", home)); |
| 416 | if (!access(user_config, R_OK)) { | 416 | struct stat st; |
| 417 | ret += perf_config_from_file(fn, user_config, data); | 417 | |
| 418 | found += 1; | 418 | if (user_config == NULL) { |
| 419 | warning("Not enough memory to process %s/.perfconfig, " | ||
| 420 | "ignoring it.", home); | ||
| 421 | goto out; | ||
| 422 | } | ||
| 423 | |||
| 424 | if (stat(user_config, &st) < 0) | ||
| 425 | goto out_free; | ||
| 426 | |||
| 427 | if (st.st_uid && (st.st_uid != geteuid())) { | ||
| 428 | warning("File %s not owned by current user or root, " | ||
| 429 | "ignoring it.", user_config); | ||
| 430 | goto out_free; | ||
| 419 | } | 431 | } |
| 432 | |||
| 433 | if (!st.st_size) | ||
| 434 | goto out_free; | ||
| 435 | |||
| 436 | ret += perf_config_from_file(fn, user_config, data); | ||
| 437 | found += 1; | ||
| 438 | out_free: | ||
| 420 | free(user_config); | 439 | free(user_config); |
| 421 | } | 440 | } |
| 422 | 441 | out: | |
| 423 | if (found == 0) | 442 | if (found == 0) |
| 424 | return -1; | 443 | return -1; |
| 425 | return ret; | 444 | return ret; |
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c index eec196329fd9..a8b53714542a 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c | |||
| @@ -1504,6 +1504,17 @@ int dso__load(struct dso *dso, struct map *map, symbol_filter_t filter) | |||
| 1504 | dso->adjust_symbols = 0; | 1504 | dso->adjust_symbols = 0; |
| 1505 | 1505 | ||
| 1506 | if (strncmp(dso->name, "/tmp/perf-", 10) == 0) { | 1506 | if (strncmp(dso->name, "/tmp/perf-", 10) == 0) { |
| 1507 | struct stat st; | ||
| 1508 | |||
| 1509 | if (stat(dso->name, &st) < 0) | ||
| 1510 | return -1; | ||
| 1511 | |||
| 1512 | if (st.st_uid && (st.st_uid != geteuid())) { | ||
| 1513 | pr_warning("File %s not owned by current user or root, " | ||
| 1514 | "ignoring it.\n", dso->name); | ||
| 1515 | return -1; | ||
| 1516 | } | ||
| 1517 | |||
| 1507 | ret = dso__load_perf_map(dso, map, filter); | 1518 | ret = dso__load_perf_map(dso, map, filter); |
| 1508 | dso->symtab_type = ret > 0 ? SYMTAB__JAVA_JIT : | 1519 | dso->symtab_type = ret > 0 ? SYMTAB__JAVA_JIT : |
| 1509 | SYMTAB__NOT_FOUND; | 1520 | SYMTAB__NOT_FOUND; |
