aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/evlist.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/util/evlist.c')
-rw-r--r--tools/perf/util/evlist.c43
1 files changed, 40 insertions, 3 deletions
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
index d81f13de2476..86a03836a83f 100644
--- a/tools/perf/util/evlist.c
+++ b/tools/perf/util/evlist.c
@@ -1181,12 +1181,12 @@ void perf_evlist__set_maps(struct perf_evlist *evlist, struct cpu_map *cpus,
1181 */ 1181 */
1182 if (cpus != evlist->cpus) { 1182 if (cpus != evlist->cpus) {
1183 cpu_map__put(evlist->cpus); 1183 cpu_map__put(evlist->cpus);
1184 evlist->cpus = cpus; 1184 evlist->cpus = cpu_map__get(cpus);
1185 } 1185 }
1186 1186
1187 if (threads != evlist->threads) { 1187 if (threads != evlist->threads) {
1188 thread_map__put(evlist->threads); 1188 thread_map__put(evlist->threads);
1189 evlist->threads = threads; 1189 evlist->threads = thread_map__get(threads);
1190 } 1190 }
1191 1191
1192 perf_evlist__propagate_maps(evlist); 1192 perf_evlist__propagate_maps(evlist);
@@ -1223,6 +1223,9 @@ int perf_evlist__set_filter(struct perf_evlist *evlist, const char *filter)
1223 int err = 0; 1223 int err = 0;
1224 1224
1225 evlist__for_each(evlist, evsel) { 1225 evlist__for_each(evlist, evsel) {
1226 if (evsel->attr.type != PERF_TYPE_TRACEPOINT)
1227 continue;
1228
1226 err = perf_evsel__set_filter(evsel, filter); 1229 err = perf_evsel__set_filter(evsel, filter);
1227 if (err) 1230 if (err)
1228 break; 1231 break;
@@ -1624,7 +1627,7 @@ size_t perf_evlist__fprintf(struct perf_evlist *evlist, FILE *fp)
1624 return printed + fprintf(fp, "\n"); 1627 return printed + fprintf(fp, "\n");
1625} 1628}
1626 1629
1627int perf_evlist__strerror_open(struct perf_evlist *evlist __maybe_unused, 1630int perf_evlist__strerror_open(struct perf_evlist *evlist,
1628 int err, char *buf, size_t size) 1631 int err, char *buf, size_t size)
1629{ 1632{
1630 int printed, value; 1633 int printed, value;
@@ -1652,7 +1655,25 @@ int perf_evlist__strerror_open(struct perf_evlist *evlist __maybe_unused,
1652 "Hint:\tTry: 'sudo sh -c \"echo -1 > /proc/sys/kernel/perf_event_paranoid\"'\n" 1655 "Hint:\tTry: 'sudo sh -c \"echo -1 > /proc/sys/kernel/perf_event_paranoid\"'\n"
1653 "Hint:\tThe current value is %d.", value); 1656 "Hint:\tThe current value is %d.", value);
1654 break; 1657 break;
1658 case EINVAL: {
1659 struct perf_evsel *first = perf_evlist__first(evlist);
1660 int max_freq;
1661
1662 if (sysctl__read_int("kernel/perf_event_max_sample_rate", &max_freq) < 0)
1663 goto out_default;
1664
1665 if (first->attr.sample_freq < (u64)max_freq)
1666 goto out_default;
1667
1668 printed = scnprintf(buf, size,
1669 "Error:\t%s.\n"
1670 "Hint:\tCheck /proc/sys/kernel/perf_event_max_sample_rate.\n"
1671 "Hint:\tThe current value is %d and %" PRIu64 " is being requested.",
1672 emsg, max_freq, first->attr.sample_freq);
1673 break;
1674 }
1655 default: 1675 default:
1676out_default:
1656 scnprintf(buf, size, "%s", emsg); 1677 scnprintf(buf, size, "%s", emsg);
1657 break; 1678 break;
1658 } 1679 }
@@ -1723,3 +1744,19 @@ void perf_evlist__set_tracking_event(struct perf_evlist *evlist,
1723 1744
1724 tracking_evsel->tracking = true; 1745 tracking_evsel->tracking = true;
1725} 1746}
1747
1748struct perf_evsel *
1749perf_evlist__find_evsel_by_str(struct perf_evlist *evlist,
1750 const char *str)
1751{
1752 struct perf_evsel *evsel;
1753
1754 evlist__for_each(evlist, evsel) {
1755 if (!evsel->name)
1756 continue;
1757 if (strcmp(str, evsel->name) == 0)
1758 return evsel;
1759 }
1760
1761 return NULL;
1762}