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

Commit eba5102d authored by Jiri Olsa's avatar Jiri Olsa
Browse files

perf tools: Add global list of opened dso objects



Adding global list of opened dso objects, so we can
track them and use the list for caching dso data file
descriptors.

Acked-by: default avatarNamhyung Kim <namhyung@kernel.org>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
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/1401892622-30848-5-git-send-email-jolsa@kernel.org


Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
parent 53fa8eaa
Loading
Loading
Loading
Loading
+39 −2
Original line number Diff line number Diff line
@@ -136,7 +136,22 @@ int dso__read_binary_type_filename(const struct dso *dso,
	return ret;
}

static int open_dso(struct dso *dso, struct machine *machine)
/*
 * Global list of open DSOs.
 */
static LIST_HEAD(dso__data_open);

static void dso__list_add(struct dso *dso)
{
	list_add_tail(&dso->data.open_entry, &dso__data_open);
}

static void dso__list_del(struct dso *dso)
{
	list_del(&dso->data.open_entry);
}

static int __open_dso(struct dso *dso, struct machine *machine)
{
	int fd;
	char *root_dir = (char *)"";
@@ -159,12 +174,33 @@ static int open_dso(struct dso *dso, struct machine *machine)
	return fd;
}

void dso__data_close(struct dso *dso)
static int open_dso(struct dso *dso, struct machine *machine)
{
	int fd = __open_dso(dso, machine);

	if (fd > 0)
		dso__list_add(dso);

	return fd;
}

static void close_data_fd(struct dso *dso)
{
	if (dso->data.fd >= 0) {
		close(dso->data.fd);
		dso->data.fd = -1;
		dso__list_del(dso);
	}
}

static void close_dso(struct dso *dso)
{
	close_data_fd(dso);
}

void dso__data_close(struct dso *dso)
{
	close_dso(dso);
}

int dso__data_fd(struct dso *dso, struct machine *machine)
@@ -499,6 +535,7 @@ struct dso *dso__new(const char *name)
		dso->kernel = DSO_TYPE_USER;
		dso->needs_swap = DSO_SWAP__UNSET;
		INIT_LIST_HEAD(&dso->node);
		INIT_LIST_HEAD(&dso->data.open_entry);
	}

	return dso;
+1 −0
Original line number Diff line number Diff line
@@ -103,6 +103,7 @@ struct dso {
	struct {
		struct rb_root	 cache;
		int		 fd;
		struct list_head open_entry;
	} data;

	char		 name[0];