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

Commit 88d3d9b7 authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo Committed by Ingo Molnar
Browse files

perf buildid-list: Introduce --with-hits option



Using this option 'perf buildid-list' will process all samples,
marking the DSOs that had some hits to list just them.

This in turn will be used by a new porcelain, 'perf archive',
that will be just a shell script to create a tarball from the
'perf buildid-list --with-hits' output and the files cached by
'perf record' in ~/.debug.

Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
LKML-Reference: <1263519930-22803-4-git-send-email-acme@infradead.org>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 59ee68ec
Loading
Loading
Loading
Loading
+34 −1
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

static char const *input_name = "perf.data";
static int force;
static bool with_hits;

static const char * const buildid_list_usage[] = {
	"perf buildid-list [<options>]",
@@ -23,6 +24,7 @@ static const char * const buildid_list_usage[] = {
};

static const struct option options[] = {
	OPT_BOOLEAN('H', "with-hits", &with_hits, "Show only DSOs with hits"),
	OPT_STRING('i', "input", &input_name, "file",
		    "input file name"),
	OPT_BOOLEAN('f', "force", &force, "don't complain, do it"),
@@ -31,6 +33,34 @@ static const struct option options[] = {
	OPT_END()
};

static int build_id_list__process_event(event_t *event,
					struct perf_session *session)
{
	struct addr_location al;
	u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
	struct thread *thread = perf_session__findnew(session, event->ip.pid);

	if (thread == NULL) {
		pr_err("problem processing %d event, skipping it.\n",
			event->header.type);
		return -1;
	}

	thread__find_addr_map(thread, session, cpumode, MAP__FUNCTION,
			      event->ip.ip, &al);

	if (al.map != NULL)
		al.map->dso->hit = 1;

	return 0;
}

static struct perf_event_ops build_id_list__event_ops = {
	.sample	= build_id_list__process_event,
	.mmap	= event__process_mmap,
	.fork	= event__process_task,
};

static int __cmd_buildid_list(void)
{
	int err = -1;
@@ -40,7 +70,10 @@ static int __cmd_buildid_list(void)
	if (session == NULL)
		return -1;

	dsos__fprintf_buildid(stdout);
	if (with_hits)
		perf_session__process_events(session, &build_id_list__event_ops);

	dsos__fprintf_buildid(stdout, with_hits);

	perf_session__delete(session);
	return err;
+7 −4
Original line number Diff line number Diff line
@@ -1716,22 +1716,25 @@ void dsos__fprintf(FILE *fp)
	__dsos__fprintf(&dsos__user, fp);
}

static size_t __dsos__fprintf_buildid(struct list_head *head, FILE *fp)
static size_t __dsos__fprintf_buildid(struct list_head *head, FILE *fp,
				      bool with_hits)
{
	struct dso *pos;
	size_t ret = 0;

	list_for_each_entry(pos, head, node) {
		if (with_hits && !pos->hit)
			continue;
		ret += dso__fprintf_buildid(pos, fp);
		ret += fprintf(fp, " %s\n", pos->long_name);
	}
	return ret;
}

size_t dsos__fprintf_buildid(FILE *fp)
size_t dsos__fprintf_buildid(FILE *fp, bool with_hits)
{
	return (__dsos__fprintf_buildid(&dsos__kernel, fp) +
		__dsos__fprintf_buildid(&dsos__user, fp));
	return (__dsos__fprintf_buildid(&dsos__kernel, fp, with_hits) +
		__dsos__fprintf_buildid(&dsos__user, fp, with_hits));
}

static struct dso *dsos__create_kernel(const char *vmlinux)
+2 −1
Original line number Diff line number Diff line
@@ -97,6 +97,7 @@ struct dso {
	u8		 slen_calculated:1;
	u8		 has_build_id:1;
	u8		 kernel:1;
	u8		 hit:1;
	unsigned char	 origin;
	u8		 sorted_by_name;
	u8		 loaded;
@@ -129,7 +130,7 @@ struct perf_session;
int dso__load(struct dso *self, struct map *map, struct perf_session *session,
	      symbol_filter_t filter);
void dsos__fprintf(FILE *fp);
size_t dsos__fprintf_buildid(FILE *fp);
size_t dsos__fprintf_buildid(FILE *fp, bool with_hits);

size_t dso__fprintf_buildid(struct dso *self, FILE *fp);
size_t dso__fprintf(struct dso *self, enum map_type type, FILE *fp);