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

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

perf tools: Release session and symbol resources on exit



So that we reduce the noise when looking for leaks using tools such as
valgrind.

Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
LKML-Reference: <new-submission>
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 591765fd
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -440,6 +440,7 @@ static void atexit_header(void)
		process_buildids();
		perf_header__write(&session->header, output, true);
		perf_session__delete(session);
		symbol__exit();
	}
}

@@ -871,7 +872,7 @@ int cmd_record(int argc, const char **argv, const char *prefix __used)
	} else {
		all_tids=malloc(sizeof(pid_t));
		if (!all_tids)
			return -ENOMEM;
			goto out_symbol_exit;

		all_tids[0] = target_tid;
		thread_num = 1;
@@ -918,5 +919,7 @@ int cmd_record(int argc, const char **argv, const char *prefix __used)
	}
	free(all_tids);
	all_tids = NULL;
out_symbol_exit:
	symbol__exit();
	return err;
}
+3 −2
Original line number Diff line number Diff line
@@ -515,12 +515,13 @@ int event__process_mmap(event_t *self, struct perf_session *session)
	if (machine == NULL)
		goto out_problem;
	thread = perf_session__findnew(session, self->mmap.pid);
	if (thread == NULL)
		goto out_problem;
	map = map__new(&machine->user_dsos, self->mmap.start,
			self->mmap.len, self->mmap.pgoff,
			self->mmap.pid, self->mmap.filename,
			MAP__FUNCTION);

	if (thread == NULL || map == NULL)
	if (map == NULL)
		goto out_problem;

	thread__insert_map(thread, map);
+26 −0
Original line number Diff line number Diff line
@@ -539,6 +539,32 @@ int machine__init(struct machine *self, const char *root_dir, pid_t pid)
	return self->root_dir == NULL ? -ENOMEM : 0;
}

static void dsos__delete(struct list_head *self)
{
	struct dso *pos, *n;

	list_for_each_entry_safe(pos, n, self, node) {
		list_del(&pos->node);
		dso__delete(pos);
	}
}

void machine__exit(struct machine *self)
{
	struct kmap *kmap = map__kmap(self->vmlinux_maps[MAP__FUNCTION]);

	if (kmap->ref_reloc_sym) {
		free((char *)kmap->ref_reloc_sym->name);
		free(kmap->ref_reloc_sym);
	}

	map_groups__exit(&self->kmaps);
	dsos__delete(&self->user_dsos);
	dsos__delete(&self->kernel_dsos);
	free(self->root_dir);
	self->root_dir = NULL;
}

struct machine *machines__add(struct rb_root *self, pid_t pid,
			      const char *root_dir)
{
+1 −0
Original line number Diff line number Diff line
@@ -143,6 +143,7 @@ struct machine *machines__find(struct rb_root *self, pid_t pid);
struct machine *machines__findnew(struct rb_root *self, pid_t pid);
char *machine__mmap_name(struct machine *self, char *bf, size_t size);
int machine__init(struct machine *self, const char *root_dir, pid_t pid);
void machine__exit(struct machine *self);

/*
 * Default guest kernel is defined by parameter --guestkallsyms
+26 −0
Original line number Diff line number Diff line
@@ -124,9 +124,35 @@ struct perf_session *perf_session__new(const char *filename, int mode, bool forc
	return NULL;
}

static void perf_session__delete_dead_threads(struct perf_session *self)
{
	struct thread *n, *t;

	list_for_each_entry_safe(t, n, &self->dead_threads, node) {
		list_del(&t->node);
		thread__delete(t);
	}
}

static void perf_session__delete_threads(struct perf_session *self)
{
	struct rb_node *nd = rb_first(&self->threads);

	while (nd) {
		struct thread *t = rb_entry(nd, struct thread, rb_node);

		rb_erase(&t->rb_node, &self->threads);
		nd = rb_next(nd);
		thread__delete(t);
	}
}

void perf_session__delete(struct perf_session *self)
{
	perf_header__exit(&self->header);
	perf_session__delete_dead_threads(self);
	perf_session__delete_threads(self);
	machine__exit(&self->host_machine);
	close(self->fd);
	free(self);
}
Loading