Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bc76efe6 authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo
Browse files

perf tools: Handle kernels that don't support attr.exclude_{guest,host}



Just fall back to resetting those fields, if set, warning the user that
that feature is not available.

If guest samples appear they will just be discarded because no struct
machine will be found and thus the event will be accounted as not
handled and dropped, see 0c095715.

Reported-by: default avatarNamhyung Kim <namhyung@gmail.com>
Tested-by: default avatarJoerg Roedel <joerg.roedel@amd.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Joerg Roedel <joerg.roedel@amd.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-vuwxig36mzprl5n7nzvnxxsh@git.kernel.org


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 8f54ed4a
Loading
Loading
Loading
Loading
+20 −9
Original line number Diff line number Diff line
@@ -204,6 +204,9 @@ static void perf_record__open(struct perf_record *rec)

		if (opts->group && pos != first)
			group_fd = first->fd;
fallback_missing_features:
		if (opts->exclude_guest_missing)
			attr->exclude_guest = attr->exclude_host = 0;
retry_sample_id:
		attr->sample_id_all = opts->sample_id_all_avail ? 1 : 0;
try_again:
@@ -217,7 +220,14 @@ static void perf_record__open(struct perf_record *rec)
			} else if (err ==  ENODEV && opts->cpu_list) {
				die("No such device - did you specify"
					" an out-of-range profile CPU?\n");
			} else if (err == EINVAL && opts->sample_id_all_avail) {
			} else if (err == EINVAL) {
				if (!opts->exclude_guest_missing &&
				    (attr->exclude_guest || attr->exclude_host)) {
					pr_debug("Old kernel, cannot exclude "
						 "guest or host samples.\n");
					opts->exclude_guest_missing = true;
					goto fallback_missing_features;
				} else if (opts->sample_id_all_avail) {
					/*
					 * Old kernel, no attr->sample_id_type_all field
					 */
@@ -227,6 +237,7 @@ static void perf_record__open(struct perf_record *rec)

					goto retry_sample_id;
				}
			}

			/*
			 * If it's cycles then fall back to hrtimer
+17 −6
Original line number Diff line number Diff line
@@ -857,6 +857,9 @@ static void perf_top__start_counters(struct perf_top *top)
		attr->mmap = 1;
		attr->comm = 1;
		attr->inherit = top->inherit;
fallback_missing_features:
		if (top->exclude_guest_missing)
			attr->exclude_guest = attr->exclude_host = 0;
retry_sample_id:
		attr->sample_id_all = top->sample_id_all_avail ? 1 : 0;
try_again:
@@ -868,13 +871,21 @@ static void perf_top__start_counters(struct perf_top *top)
			if (err == EPERM || err == EACCES) {
				ui__error_paranoid();
				goto out_err;
			} else if (err == EINVAL && top->sample_id_all_avail) {
			} else if (err == EINVAL) {
				if (!top->exclude_guest_missing &&
				    (attr->exclude_guest || attr->exclude_host)) {
					pr_debug("Old kernel, cannot exclude "
						 "guest or host samples.\n");
					top->exclude_guest_missing = true;
					goto fallback_missing_features;
				} else if (top->sample_id_all_avail) {
					/*
					 * Old kernel, no attr->sample_id_type_all field
					 */
					top->sample_id_all_avail = false;
					goto retry_sample_id;
				}
			}
			/*
			 * If it's cycles then fall back to hrtimer
			 * based cpu-clock-tick sw counter, which
+1 −0
Original line number Diff line number Diff line
@@ -199,6 +199,7 @@ struct perf_record_opts {
	bool	     sample_address;
	bool	     sample_time;
	bool	     sample_id_all_avail;
	bool	     exclude_guest_missing;
	bool	     system_wide;
	bool	     period;
	unsigned int freq;
+1 −0
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ struct perf_top {
	bool		   inherit;
	bool		   group;
	bool		   sample_id_all_avail;
	bool		   exclude_guest_missing;
	bool		   dump_symtab;
	const char	   *cpu_list;
	struct hist_entry  *sym_filter_entry;