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

Commit 352ea45a authored by Jiri Olsa's avatar Jiri Olsa Committed by Arnaldo Carvalho de Melo
Browse files

perf callchain: Add mask into struct regs_dump



Adding mask info into struct regs_dump to make the registers information
compact.

The mask was always passed along, so logically the mask info fits more
into the struct regs_dump.

Signed-off-by: default avatarJiri Olsa <jolsa@redhat.com>
Acked-by: default avatarJean Pihet <jean.pihet@linaro.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jean Pihet <jean.pihet@linaro.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1389098853-14466-9-git-send-email-jolsa@redhat.com


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 1cf0382a
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ int test__arch_unwind_sample(struct perf_sample *sample,
	perf_regs_load(buf);
	regs->abi  = PERF_SAMPLE_REGS_ABI;
	regs->regs = buf;
	regs->mask = PERF_REGS_MASK;

	return sample_ustack(sample, thread, buf);
}
+0 −1
Original line number Diff line number Diff line
@@ -312,7 +312,6 @@ static int perf_inject__sched_stat(struct perf_tool *tool,
	sample_sw.period = sample->period;
	sample_sw.time	 = sample->time;
	perf_event__synthesize_sample(event_sw, evsel->attr.sample_type,
				      evsel->attr.sample_regs_user,
				      evsel->attr.read_format, &sample_sw,
				      false);
	build_id__mark_dso_hit(tool, event_sw, &sample_sw, evsel, machine);
+1 −1
Original line number Diff line number Diff line
@@ -72,7 +72,7 @@ static int unwind_thread(struct thread *thread, struct machine *machine)
	}

	err = unwind__get_entries(unwind_entry, &cnt, machine, thread,
				  PERF_REGS_MASK, &sample, MAX_STACK);
				  &sample, MAX_STACK);
	if (err)
		pr_debug("unwind failed\n");
	else if (cnt != MAX_STACK) {
+8 −9
Original line number Diff line number Diff line
@@ -22,8 +22,8 @@
} while (0)

static bool samples_same(const struct perf_sample *s1,
			 const struct perf_sample *s2, u64 type, u64 regs_user,
			 u64 read_format)
			 const struct perf_sample *s2,
			 u64 type, u64 read_format)
{
	size_t i;

@@ -95,8 +95,9 @@ static bool samples_same(const struct perf_sample *s1,
	}

	if (type & PERF_SAMPLE_REGS_USER) {
		size_t sz = hweight_long(regs_user) * sizeof(u64);
		size_t sz = hweight_long(s1->user_regs.mask) * sizeof(u64);

		COMP(user_regs.mask);
		COMP(user_regs.abi);
		if (s1->user_regs.abi &&
		    (!s1->user_regs.regs || !s2->user_regs.regs ||
@@ -174,6 +175,7 @@ static int do_test(u64 sample_type, u64 sample_regs_user, u64 read_format)
		.branch_stack	= &branch_stack.branch_stack,
		.user_regs	= {
			.abi	= PERF_SAMPLE_REGS_ABI_64,
			.mask	= sample_regs_user,
			.regs	= user_regs,
		},
		.user_stack	= {
@@ -201,8 +203,7 @@ static int do_test(u64 sample_type, u64 sample_regs_user, u64 read_format)
		sample.read.one.id    = 99;
	}

	sz = perf_event__sample_event_size(&sample, sample_type,
					   sample_regs_user, read_format);
	sz = perf_event__sample_event_size(&sample, sample_type, read_format);
	bufsz = sz + 4096; /* Add a bit for overrun checking */
	event = malloc(bufsz);
	if (!event) {
@@ -215,8 +216,7 @@ static int do_test(u64 sample_type, u64 sample_regs_user, u64 read_format)
	event->header.misc = 0;
	event->header.size = sz;

	err = perf_event__synthesize_sample(event, sample_type,
					    sample_regs_user, read_format,
	err = perf_event__synthesize_sample(event, sample_type, read_format,
					    &sample, false);
	if (err) {
		pr_debug("%s failed for sample_type %#"PRIx64", error %d\n",
@@ -244,8 +244,7 @@ static int do_test(u64 sample_type, u64 sample_regs_user, u64 read_format)
		goto out_free;
	}

	if (!samples_same(&sample, &sample_out, sample_type,
			  sample_regs_user, read_format)) {
	if (!samples_same(&sample, &sample_out, sample_type, read_format)) {
		pr_debug("parsing failed for sample_type %#"PRIx64"\n",
			 sample_type);
		goto out_free;
+3 −2
Original line number Diff line number Diff line
@@ -85,6 +85,7 @@ struct sample_event {

struct regs_dump {
	u64 abi;
	u64 mask;
	u64 *regs;
};

@@ -259,9 +260,9 @@ int perf_event__preprocess_sample(const union perf_event *event,
const char *perf_event__name(unsigned int id);

size_t perf_event__sample_event_size(const struct perf_sample *sample, u64 type,
				     u64 sample_regs_user, u64 read_format);
				     u64 read_format);
int perf_event__synthesize_sample(union perf_event *event, u64 type,
				  u64 sample_regs_user, u64 read_format,
				  u64 read_format,
				  const struct perf_sample *sample,
				  bool swapped);

Loading