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

Commit b7c92427 authored by Ingo Molnar's avatar Ingo Molnar
Browse files

Merge tag 'perf-urgent-for-mingo' of...

Merge tag 'perf-urgent-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux

 into perf/urgent

Cherry picked fixes from perf/core, together with the kernel fix (1018faa6),
the sampling tools (top, record) are back working on AMD systems.

Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parents 1018faa6 bc76efe6
Loading
Loading
Loading
Loading
+22 −11
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
@@ -503,9 +514,9 @@ static int __cmd_record(struct perf_record *rec, int argc, const char **argv)
			return err;
	}

	if (!!rec->no_buildid
	if (!rec->no_buildid
	    && !perf_header__has_feat(&session->header, HEADER_BUILD_ID)) {
		pr_err("Couldn't generating buildids. "
		pr_err("Couldn't generate buildids. "
		       "Use --no-buildid to profile anyway.\n");
		return -1;
	}
+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;
+1 −1
Original line number Diff line number Diff line
@@ -6,7 +6,7 @@
 * XXX We need to find a better place for these things...
 */
bool perf_host  = true;
bool perf_guest = true;
bool perf_guest = false;

void event_attr_init(struct perf_event_attr *attr)
{