4 #include "parse-events.h"
8 typedef void (*setup_probe_fn_t)(struct perf_evsel *evsel);
10 static int perf_do_probe_api(setup_probe_fn_t fn, int cpu, const char *str)
12 struct perf_evlist *evlist;
13 struct perf_evsel *evsel;
14 int err = -EAGAIN, fd;
16 evlist = perf_evlist__new();
20 if (parse_events(evlist, str))
23 evsel = perf_evlist__first(evlist);
25 fd = sys_perf_event_open(&evsel->attr, -1, cpu, -1, 0);
32 fd = sys_perf_event_open(&evsel->attr, -1, cpu, -1, 0);
42 perf_evlist__delete(evlist);
46 static bool perf_probe_api(setup_probe_fn_t fn)
48 const char *try[] = {"cycles:u", "instructions:u", "cpu-clock", NULL};
52 cpus = cpu_map__new(NULL);
56 cpu_map__delete(cpus);
59 ret = perf_do_probe_api(fn, cpu, try[i++]);
62 } while (ret == -EAGAIN && try[i]);
67 static void perf_probe_sample_identifier(struct perf_evsel *evsel)
69 evsel->attr.sample_type |= PERF_SAMPLE_IDENTIFIER;
72 static void perf_probe_comm_exec(struct perf_evsel *evsel)
74 evsel->attr.comm_exec = 1;
77 bool perf_can_sample_identifier(void)
79 return perf_probe_api(perf_probe_sample_identifier);
82 static bool perf_can_comm_exec(void)
84 return perf_probe_api(perf_probe_comm_exec);
87 void perf_evlist__config(struct perf_evlist *evlist, struct record_opts *opts)
89 struct perf_evsel *evsel;
90 bool use_sample_identifier = false;
94 * Set the evsel leader links before we configure attributes,
95 * since some might depend on this info.
98 perf_evlist__set_leader(evlist);
100 if (evlist->cpus->map[0] < 0)
101 opts->no_inherit = true;
103 use_comm_exec = perf_can_comm_exec();
105 evlist__for_each(evlist, evsel) {
106 perf_evsel__config(evsel, opts);
107 if (!evsel->idx && use_comm_exec)
108 evsel->attr.comm_exec = 1;
111 if (evlist->nr_entries > 1) {
112 struct perf_evsel *first = perf_evlist__first(evlist);
114 evlist__for_each(evlist, evsel) {
115 if (evsel->attr.sample_type == first->attr.sample_type)
117 use_sample_identifier = perf_can_sample_identifier();
120 evlist__for_each(evlist, evsel)
121 perf_evsel__set_sample_id(evsel, use_sample_identifier);
124 perf_evlist__set_id_pos(evlist);
127 static int get_max_rate(unsigned int *rate)
130 const char *procfs = procfs__mountpoint();
135 snprintf(path, PATH_MAX,
136 "%s/sys/kernel/perf_event_max_sample_rate", procfs);
138 return filename__read_int(path, (int *) rate);
141 static int record_opts__config_freq(struct record_opts *opts)
143 bool user_freq = opts->user_freq != UINT_MAX;
144 unsigned int max_rate;
146 if (opts->user_interval != ULLONG_MAX)
147 opts->default_interval = opts->user_interval;
149 opts->freq = opts->user_freq;
152 * User specified count overrides default frequency.
154 if (opts->default_interval)
156 else if (opts->freq) {
157 opts->default_interval = opts->freq;
159 pr_err("frequency and count are zero, aborting\n");
163 if (get_max_rate(&max_rate))
167 * User specified frequency is over current maximum.
169 if (user_freq && (max_rate < opts->freq)) {
170 pr_err("Maximum frequency rate (%u) reached.\n"
171 "Please use -F freq option with lower value or consider\n"
172 "tweaking /proc/sys/kernel/perf_event_max_sample_rate.\n",
178 * Default frequency is over current maximum.
180 if (max_rate < opts->freq) {
181 pr_warning("Lowering default frequency rate to %u.\n"
182 "Please consider tweaking "
183 "/proc/sys/kernel/perf_event_max_sample_rate.\n",
185 opts->freq = max_rate;
191 int record_opts__config(struct record_opts *opts)
193 return record_opts__config_freq(opts);
196 bool perf_evlist__can_select_event(struct perf_evlist *evlist, const char *str)
198 struct perf_evlist *temp_evlist;
199 struct perf_evsel *evsel;
203 temp_evlist = perf_evlist__new();
207 err = parse_events(temp_evlist, str);
211 evsel = perf_evlist__last(temp_evlist);
213 if (!evlist || cpu_map__empty(evlist->cpus)) {
214 struct cpu_map *cpus = cpu_map__new(NULL);
216 cpu = cpus ? cpus->map[0] : 0;
217 cpu_map__delete(cpus);
219 cpu = evlist->cpus->map[0];
222 fd = sys_perf_event_open(&evsel->attr, -1, cpu, -1, 0);
229 perf_evlist__delete(temp_evlist);