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

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

perf machine: No need to have two DSOs lists

We can, given a DSO, figure out if it is a kernel, a kernel module or
a userlevel DSO, so stop having to process two lists in several
functions.

If searching becomes an issue at some point, we can have them in a
rbtree, etc.

Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Borislav Petkov <bp@suse.de>
Cc: David Ahern <dsahern@gmail.com>
Cc: Don Zickus <dzickus@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-s4yb0onpdywu6dj2xl9lxi4t@git.kernel.org


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 459ce518
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -121,7 +121,7 @@ struct machine *setup_fake_machine(struct machines *machines)
		size_t k;
		struct dso *dso;

		dso = __dsos__findnew(&machine->user_dsos,
		dso = __dsos__findnew(&machine->dsos,
				      fake_symbols[i].dso_name);
		if (dso == NULL)
			goto out;
+16 −43
Original line number Diff line number Diff line
@@ -162,15 +162,20 @@ static int write_buildid(const char *name, size_t name_len, u8 *build_id,
	return write_padded(fd, name, name_len + 1, len);
}

static int __dsos__write_buildid_table(struct list_head *head,
				       struct machine *machine,
				       pid_t pid, u16 misc, int fd)
static int machine__write_buildid_table(struct machine *machine, int fd)
{
	int err = 0;
	char nm[PATH_MAX];
	struct dso *pos;
	u16 kmisc = PERF_RECORD_MISC_KERNEL,
	    umisc = PERF_RECORD_MISC_USER;

	dsos__for_each_with_build_id(pos, head) {
		int err;
	if (!machine__is_host(machine)) {
		kmisc = PERF_RECORD_MISC_GUEST_KERNEL;
		umisc = PERF_RECORD_MISC_GUEST_USER;
	}

	dsos__for_each_with_build_id(pos, &machine->dsos.head) {
		const char *name;
		size_t name_len;

@@ -189,32 +194,12 @@ static int __dsos__write_buildid_table(struct list_head *head,
			name_len = pos->long_name_len + 1;
		}

		err = write_buildid(name, name_len, pos->build_id,
				    pid, misc, fd);
		err = write_buildid(name, name_len, pos->build_id, machine->pid,
				    pos->kernel ? kmisc : umisc, fd);
		if (err)
			return err;
	}

	return 0;
}

static int machine__write_buildid_table(struct machine *machine, int fd)
{
	int err;
	u16 kmisc = PERF_RECORD_MISC_KERNEL,
	    umisc = PERF_RECORD_MISC_USER;

	if (!machine__is_host(machine)) {
		kmisc = PERF_RECORD_MISC_GUEST_KERNEL;
		umisc = PERF_RECORD_MISC_GUEST_USER;
			break;
	}

	err = __dsos__write_buildid_table(&machine->kernel_dsos.head, machine,
					  machine->pid, kmisc, fd);
	if (err == 0)
		err = __dsos__write_buildid_table(&machine->user_dsos.head,
						  machine, machine->pid, umisc,
						  fd);
	return err;
}

@@ -247,13 +232,7 @@ static int __dsos__hit_all(struct list_head *head)

static int machine__hit_all_dsos(struct machine *machine)
{
	int err;

	err = __dsos__hit_all(&machine->kernel_dsos.head);
	if (err)
		return err;

	return __dsos__hit_all(&machine->user_dsos.head);
	return __dsos__hit_all(&machine->dsos.head);
}

int dsos__hit_all(struct perf_session *session)
@@ -493,9 +472,7 @@ static int __dsos__cache_build_ids(struct list_head *head,

static int machine__cache_build_ids(struct machine *machine)
{
	int ret = __dsos__cache_build_ids(&machine->kernel_dsos.head, machine);
	ret |= __dsos__cache_build_ids(&machine->user_dsos.head, machine);
	return ret;
	return __dsos__cache_build_ids(&machine->dsos.head, machine);
}

int perf_session__cache_build_ids(struct perf_session *session)
@@ -520,11 +497,7 @@ int perf_session__cache_build_ids(struct perf_session *session)

static bool machine__read_build_ids(struct machine *machine, bool with_hits)
{
	bool ret;

	ret  = __dsos__read_build_ids(&machine->kernel_dsos.head, with_hits);
	ret |= __dsos__read_build_ids(&machine->user_dsos.head, with_hits);
	return ret;
	return __dsos__read_build_ids(&machine->dsos.head, with_hits);
}

bool perf_session__read_build_ids(struct perf_session *session, bool with_hits)
+1 −1
Original line number Diff line number Diff line
@@ -833,7 +833,7 @@ struct dso *machine__findnew_kernel(struct machine *machine, const char *name,
	/*
	 * The kernel dso could be created by build_id processing.
	 */
	struct dso *dso = __dsos__findnew(&machine->kernel_dsos, name);
	struct dso *dso = __dsos__findnew(&machine->dsos, name);

	/*
	 * We need to run this in all cases, since during the build_id
+1 −5
Original line number Diff line number Diff line
@@ -1238,7 +1238,6 @@ static int __event_process_build_id(struct build_id_event *bev,
				    struct perf_session *session)
{
	int err = -1;
	struct dsos *dsos;
	struct machine *machine;
	u16 misc;
	struct dso *dso;
@@ -1253,22 +1252,19 @@ static int __event_process_build_id(struct build_id_event *bev,
	switch (misc) {
	case PERF_RECORD_MISC_KERNEL:
		dso_type = DSO_TYPE_KERNEL;
		dsos = &machine->kernel_dsos;
		break;
	case PERF_RECORD_MISC_GUEST_KERNEL:
		dso_type = DSO_TYPE_GUEST_KERNEL;
		dsos = &machine->kernel_dsos;
		break;
	case PERF_RECORD_MISC_USER:
	case PERF_RECORD_MISC_GUEST_USER:
		dso_type = DSO_TYPE_USER;
		dsos = &machine->user_dsos;
		break;
	default:
		goto out;
	}

	dso = __dsos__findnew(dsos, filename);
	dso = __dsos__findnew(&machine->dsos, filename);
	if (dso != NULL) {
		char sbuild_id[BUILD_ID_SIZE * 2 + 1];

+11 −17
Original line number Diff line number Diff line
@@ -26,8 +26,7 @@ int machine__init(struct machine *machine, const char *root_dir, pid_t pid)
{
	map_groups__init(&machine->kmaps, machine);
	RB_CLEAR_NODE(&machine->rb_node);
	dsos__init(&machine->user_dsos);
	dsos__init(&machine->kernel_dsos);
	dsos__init(&machine->dsos);

	machine->threads = RB_ROOT;
	pthread_rwlock_init(&machine->threads_lock, NULL);
@@ -111,8 +110,7 @@ void machine__delete_threads(struct machine *machine)
void machine__exit(struct machine *machine)
{
	map_groups__exit(&machine->kmaps);
	dsos__delete(&machine->user_dsos);
	dsos__delete(&machine->kernel_dsos);
	dsos__delete(&machine->dsos);
	vdso__exit(machine);
	zfree(&machine->root_dir);
	zfree(&machine->current_tid);
@@ -490,9 +488,9 @@ machine__module_dso(struct machine *machine, struct kmod_path *m,
{
	struct dso *dso;

	dso = dsos__find(&machine->kernel_dsos, m->name, true);
	dso = dsos__find(&machine->dsos, m->name, true);
	if (!dso) {
		dso = dsos__addnew(&machine->kernel_dsos, m->name);
		dso = dsos__addnew(&machine->dsos, m->name);
		if (dso == NULL)
			return NULL;

@@ -561,13 +559,11 @@ struct map *machine__new_module(struct machine *machine, u64 start,
size_t machines__fprintf_dsos(struct machines *machines, FILE *fp)
{
	struct rb_node *nd;
	size_t ret = __dsos__fprintf(&machines->host.kernel_dsos.head, fp) +
		     __dsos__fprintf(&machines->host.user_dsos.head, fp);
	size_t ret = __dsos__fprintf(&machines->host.dsos.head, fp);

	for (nd = rb_first(&machines->guests); nd; nd = rb_next(nd)) {
		struct machine *pos = rb_entry(nd, struct machine, rb_node);
		ret += __dsos__fprintf(&pos->kernel_dsos.head, fp);
		ret += __dsos__fprintf(&pos->user_dsos.head, fp);
		ret += __dsos__fprintf(&pos->dsos.head, fp);
	}

	return ret;
@@ -576,8 +572,7 @@ size_t machines__fprintf_dsos(struct machines *machines, FILE *fp)
size_t machine__fprintf_dsos_buildid(struct machine *m, FILE *fp,
				     bool (skip)(struct dso *dso, int parm), int parm)
{
	return __dsos__fprintf_buildid(&m->kernel_dsos.head, fp, skip, parm) +
	       __dsos__fprintf_buildid(&m->user_dsos.head, fp, skip, parm);
	return __dsos__fprintf_buildid(&m->dsos.head, fp, skip, parm);
}

size_t machines__fprintf_dsos_buildid(struct machines *machines, FILE *fp,
@@ -1106,7 +1101,7 @@ static bool machine__uses_kcore(struct machine *machine)
{
	struct dso *dso;

	list_for_each_entry(dso, &machine->kernel_dsos.head, node) {
	list_for_each_entry(dso, &machine->dsos.head, node) {
		if (dso__is_kcore(dso))
			return true;
	}
@@ -1153,8 +1148,8 @@ static int machine__process_kernel_mmap_event(struct machine *machine,
		struct dso *kernel = NULL;
		struct dso *dso;

		list_for_each_entry(dso, &machine->kernel_dsos.head, node) {
			if (is_kernel_module(dso->long_name))
		list_for_each_entry(dso, &machine->dsos.head, node) {
			if (dso->kernel && is_kernel_module(dso->long_name))
				continue;

			kernel = dso;
@@ -1162,8 +1157,7 @@ static int machine__process_kernel_mmap_event(struct machine *machine,
		}

		if (kernel == NULL)
			kernel = __dsos__findnew(&machine->kernel_dsos,
						 kmmap_prefix);
			kernel = __dsos__findnew(&machine->dsos, kmmap_prefix);
		if (kernel == NULL)
			goto out_problem;

Loading