aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf
diff options
context:
space:
mode:
authorNamhyung Kim <namhyung@kernel.org>2015-08-09 02:45:23 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2015-08-10 16:20:26 -0400
commit09af2a553577a6e53e40011a910be0f27ce56f3e (patch)
tree7b42882057118e4d8f5f8a847f644ae8cd206123 /tools/perf
parent31191a85fb875cf123cea56bbfd34f4b941f3c79 (diff)
perf record: Support per-event freq term
Now perf can set per-event value of time and (sampling) period. But I guess most users like me just want to set frequency rather than period. So add the 'freq' term in the event parser. Signed-off-by: Namhyung Kim <namhyung@kernel.org> Acked-by: Jiri Olsa <jolsa@kernel.org> Cc: David Ahern <dsahern@gmail.com> Cc: Kan Liang <kan.liang@intel.com> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/r/1439102724-14079-1-git-send-email-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf')
-rw-r--r--tools/perf/Documentation/perf-record.txt1
-rw-r--r--tools/perf/util/evsel.c4
-rw-r--r--tools/perf/util/evsel.h2
-rw-r--r--tools/perf/util/parse-events.c6
-rw-r--r--tools/perf/util/parse-events.h1
-rw-r--r--tools/perf/util/parse-events.l1
-rw-r--r--tools/perf/util/pmu.c2
7 files changed, 16 insertions, 1 deletions
diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Documentation/perf-record.txt
index 0d852d1bc90f..afbe45ef7e3e 100644
--- a/tools/perf/Documentation/perf-record.txt
+++ b/tools/perf/Documentation/perf-record.txt
@@ -49,6 +49,7 @@ OPTIONS
49 These params can be used to overload default config values per event. 49 These params can be used to overload default config values per event.
50 Here is a list of the params. 50 Here is a list of the params.
51 - 'period': Set event sampling period 51 - 'period': Set event sampling period
52 - 'freq': Set event sampling frequency
52 - 'time': Disable/enable time stamping. Acceptable values are 1 for 53 - 'time': Disable/enable time stamping. Acceptable values are 1 for
53 enabling time stamping. 0 for disabling time stamping. 54 enabling time stamping. 0 for disabling time stamping.
54 The default is 1. 55 The default is 1.
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index a59710f88d8a..f664a22b5fea 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -600,6 +600,10 @@ static void apply_config_terms(struct perf_evsel *evsel)
600 attr->sample_period = term->val.period; 600 attr->sample_period = term->val.period;
601 attr->freq = 0; 601 attr->freq = 0;
602 break; 602 break;
603 case PERF_EVSEL__CONFIG_TERM_FREQ:
604 attr->sample_freq = term->val.freq;
605 attr->freq = 1;
606 break;
603 case PERF_EVSEL__CONFIG_TERM_TIME: 607 case PERF_EVSEL__CONFIG_TERM_TIME:
604 if (term->val.time) 608 if (term->val.time)
605 perf_evsel__set_sample_bit(evsel, TIME); 609 perf_evsel__set_sample_bit(evsel, TIME);
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index b948f69d2558..fdf2674ab339 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -39,6 +39,7 @@ struct cgroup_sel;
39*/ 39*/
40enum { 40enum {
41 PERF_EVSEL__CONFIG_TERM_PERIOD, 41 PERF_EVSEL__CONFIG_TERM_PERIOD,
42 PERF_EVSEL__CONFIG_TERM_FREQ,
42 PERF_EVSEL__CONFIG_TERM_TIME, 43 PERF_EVSEL__CONFIG_TERM_TIME,
43 PERF_EVSEL__CONFIG_TERM_MAX, 44 PERF_EVSEL__CONFIG_TERM_MAX,
44}; 45};
@@ -48,6 +49,7 @@ struct perf_evsel_config_term {
48 int type; 49 int type;
49 union { 50 union {
50 u64 period; 51 u64 period;
52 u64 freq;
51 bool time; 53 bool time;
52 } val; 54 } val;
53}; 55};
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 828936dc3f1e..dbf315df4220 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -597,6 +597,9 @@ do { \
597 case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD: 597 case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD:
598 CHECK_TYPE_VAL(NUM); 598 CHECK_TYPE_VAL(NUM);
599 break; 599 break;
600 case PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ:
601 CHECK_TYPE_VAL(NUM);
602 break;
600 case PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE: 603 case PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE:
601 /* 604 /*
602 * TODO uncomment when the field is available 605 * TODO uncomment when the field is available
@@ -659,6 +662,9 @@ do { \
659 case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD: 662 case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD:
660 ADD_CONFIG_TERM(PERIOD, period, term->val.num); 663 ADD_CONFIG_TERM(PERIOD, period, term->val.num);
661 break; 664 break;
665 case PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ:
666 ADD_CONFIG_TERM(FREQ, freq, term->val.num);
667 break;
662 case PARSE_EVENTS__TERM_TYPE_TIME: 668 case PARSE_EVENTS__TERM_TYPE_TIME:
663 ADD_CONFIG_TERM(TIME, time, term->val.num); 669 ADD_CONFIG_TERM(TIME, time, term->val.num);
664 break; 670 break;
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index e6f9aacc1cce..ce2d13a16226 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -62,6 +62,7 @@ enum {
62 PARSE_EVENTS__TERM_TYPE_CONFIG2, 62 PARSE_EVENTS__TERM_TYPE_CONFIG2,
63 PARSE_EVENTS__TERM_TYPE_NAME, 63 PARSE_EVENTS__TERM_TYPE_NAME,
64 PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD, 64 PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD,
65 PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ,
65 PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE, 66 PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE,
66 PARSE_EVENTS__TERM_TYPE_TIME, 67 PARSE_EVENTS__TERM_TYPE_TIME,
67}; 68};
diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l
index f5427505ae77..4306f5ad75c7 100644
--- a/tools/perf/util/parse-events.l
+++ b/tools/perf/util/parse-events.l
@@ -182,6 +182,7 @@ config1 { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG1); }
182config2 { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG2); } 182config2 { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_CONFIG2); }
183name { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_NAME); } 183name { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_NAME); }
184period { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD); } 184period { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD); }
185freq { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ); }
185branch_type { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE); } 186branch_type { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE); }
186time { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_TIME); } 187time { return term(yyscanner, PARSE_EVENTS__TERM_TYPE_TIME); }
187, { return ','; } 188, { return ','; }
diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
index d4b0e6454bc6..d85f11b8cacf 100644
--- a/tools/perf/util/pmu.c
+++ b/tools/perf/util/pmu.c
@@ -634,7 +634,7 @@ static char *formats_error_string(struct list_head *formats)
634{ 634{
635 struct perf_pmu_format *format; 635 struct perf_pmu_format *format;
636 char *err, *str; 636 char *err, *str;
637 static const char *static_terms = "config,config1,config2,name,period,branch_type,time\n"; 637 static const char *static_terms = "config,config1,config2,name,period,freq,branch_type,time\n";
638 unsigned i = 0; 638 unsigned i = 0;
639 639
640 if (!asprintf(&str, "valid terms:")) 640 if (!asprintf(&str, "valid terms:"))