aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMathieu Poirier <mathieu.poirier@linaro.org>2016-09-16 10:44:05 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2016-09-29 10:16:59 -0400
commit1e85748437ba5fd05abe5396d67062e0b4b502f2 (patch)
tree81cdfc24b11a1304281a076931a996856408fbe6
parent3541c034d9b953cbd4b961db74630fb6d72e7f37 (diff)
perf evsel: Add support for address filters
This patch makes it possible to use the current filter framework with address filters. That way address filters for HW tracers such as CoreSight and Intel PT can be communicated to the kernel drivers. Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org> Acked-by: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: linux-arm-kernel@lists.infradead.org Link: http://lkml.kernel.org/r/1474037045-31730-4-git-send-email-mathieu.poirier@linaro.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r--tools/perf/util/evsel.c5
-rw-r--r--tools/perf/util/evsel.h2
-rw-r--r--tools/perf/util/parse-events.c39
3 files changed, 41 insertions, 5 deletions
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 3b4e7c452e43..380e84c3af3d 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -1067,6 +1067,11 @@ int perf_evsel__append_tp_filter(struct perf_evsel *evsel, const char *filter)
1067 return perf_evsel__append_filter(evsel, "(%s) && (%s)", filter); 1067 return perf_evsel__append_filter(evsel, "(%s) && (%s)", filter);
1068} 1068}
1069 1069
1070int perf_evsel__append_addr_filter(struct perf_evsel *evsel, const char *filter)
1071{
1072 return perf_evsel__append_filter(evsel, "%s,%s", filter);
1073}
1074
1070int perf_evsel__enable(struct perf_evsel *evsel) 1075int perf_evsel__enable(struct perf_evsel *evsel)
1071{ 1076{
1072 int nthreads = thread_map__nr(evsel->threads); 1077 int nthreads = thread_map__nr(evsel->threads);
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index 1f8c48f87f7d..b1503b0ecdff 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -236,6 +236,8 @@ void perf_evsel__set_sample_id(struct perf_evsel *evsel,
236 236
237int perf_evsel__set_filter(struct perf_evsel *evsel, const char *filter); 237int perf_evsel__set_filter(struct perf_evsel *evsel, const char *filter);
238int perf_evsel__append_tp_filter(struct perf_evsel *evsel, const char *filter); 238int perf_evsel__append_tp_filter(struct perf_evsel *evsel, const char *filter);
239int perf_evsel__append_addr_filter(struct perf_evsel *evsel,
240 const char *filter);
239int perf_evsel__apply_filter(struct perf_evsel *evsel, int ncpus, int nthreads, 241int perf_evsel__apply_filter(struct perf_evsel *evsel, int ncpus, int nthreads,
240 const char *filter); 242 const char *filter);
241int perf_evsel__enable(struct perf_evsel *evsel); 243int perf_evsel__enable(struct perf_evsel *evsel);
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 16bf09cc3e8d..33546c3ac1fe 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -1760,20 +1760,49 @@ foreach_evsel_in_last_glob(struct perf_evlist *evlist,
1760static int set_filter(struct perf_evsel *evsel, const void *arg) 1760static int set_filter(struct perf_evsel *evsel, const void *arg)
1761{ 1761{
1762 const char *str = arg; 1762 const char *str = arg;
1763 bool found = false;
1764 int nr_addr_filters = 0;
1765 struct perf_pmu *pmu = NULL;
1763 1766
1764 if (evsel == NULL || evsel->attr.type != PERF_TYPE_TRACEPOINT) { 1767 if (evsel == NULL)
1765 fprintf(stderr, 1768 goto err;
1766 "--filter option should follow a -e tracepoint option\n"); 1769
1767 return -1; 1770 if (evsel->attr.type == PERF_TYPE_TRACEPOINT) {
1771 if (perf_evsel__append_tp_filter(evsel, str) < 0) {
1772 fprintf(stderr,
1773 "not enough memory to hold filter string\n");
1774 return -1;
1775 }
1776
1777 return 0;
1768 } 1778 }
1769 1779
1770 if (perf_evsel__append_tp_filter(evsel, str) < 0) { 1780 while ((pmu = perf_pmu__scan(pmu)) != NULL)
1781 if (pmu->type == evsel->attr.type) {
1782 found = true;
1783 break;
1784 }
1785
1786 if (found)
1787 perf_pmu__scan_file(pmu, "nr_addr_filters",
1788 "%d", &nr_addr_filters);
1789
1790 if (!nr_addr_filters)
1791 goto err;
1792
1793 if (perf_evsel__append_addr_filter(evsel, str) < 0) {
1771 fprintf(stderr, 1794 fprintf(stderr,
1772 "not enough memory to hold filter string\n"); 1795 "not enough memory to hold filter string\n");
1773 return -1; 1796 return -1;
1774 } 1797 }
1775 1798
1776 return 0; 1799 return 0;
1800
1801err:
1802 fprintf(stderr,
1803 "--filter option should follow a -e tracepoint or HW tracer option\n");
1804
1805 return -1;
1777} 1806}
1778 1807
1779int parse_filter(const struct option *opt, const char *str, 1808int parse_filter(const struct option *opt, const char *str,