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

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

perf tools: Add dso__data_* interface descriptons



Adding descriptions/explanations for dso__data_* interface
functions.

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-10-git-send-email-jolsa@kernel.org


Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
parent a08cae03
Loading
Loading
Loading
Loading
+59 −0
Original line number Original line Diff line number Diff line
@@ -205,6 +205,13 @@ static int __open_dso(struct dso *dso, struct machine *machine)


static void check_data_close(void);
static void check_data_close(void);


/**
 * dso_close - Open DSO data file
 * @dso: dso object
 *
 * Open @dso's data file descriptor and updates
 * list/count of open DSO objects.
 */
static int open_dso(struct dso *dso, struct machine *machine)
static int open_dso(struct dso *dso, struct machine *machine)
{
{
	int fd = __open_dso(dso, machine);
	int fd = __open_dso(dso, machine);
@@ -231,6 +238,13 @@ static void close_data_fd(struct dso *dso)
	}
	}
}
}


/**
 * dso_close - Close DSO data file
 * @dso: dso object
 *
 * Close @dso's data file descriptor and updates
 * list/count of open DSO objects.
 */
static void close_dso(struct dso *dso)
static void close_dso(struct dso *dso)
{
{
	close_data_fd(dso);
	close_data_fd(dso);
@@ -276,6 +290,11 @@ static bool may_cache_fd(void)
	return limit > (rlim_t) dso__data_open_cnt;
	return limit > (rlim_t) dso__data_open_cnt;
}
}


/*
 * Check and close LRU dso if we crossed allowed limit
 * for opened dso file descriptors. The limit is half
 * of the RLIMIT_NOFILE files opened.
*/
static void check_data_close(void)
static void check_data_close(void)
{
{
	bool cache_fd = may_cache_fd();
	bool cache_fd = may_cache_fd();
@@ -284,11 +303,25 @@ static void check_data_close(void)
		close_first_dso();
		close_first_dso();
}
}


/**
 * dso__data_close - Close DSO data file
 * @dso: dso object
 *
 * External interface to close @dso's data file descriptor.
 */
void dso__data_close(struct dso *dso)
void dso__data_close(struct dso *dso)
{
{
	close_dso(dso);
	close_dso(dso);
}
}


/**
 * dso__data_fd - Get dso's data file descriptor
 * @dso: dso object
 * @machine: machine object
 *
 * External interface to find dso's file, open it and
 * returns file descriptor.
 */
int dso__data_fd(struct dso *dso, struct machine *machine)
int dso__data_fd(struct dso *dso, struct machine *machine)
{
{
	enum dso_binary_type binary_type_data[] = {
	enum dso_binary_type binary_type_data[] = {
@@ -445,6 +478,11 @@ static ssize_t dso_cache_read(struct dso *dso, u64 offset,
		return dso_cache__read(dso, offset, data, size);
		return dso_cache__read(dso, offset, data, size);
}
}


/*
 * Reads and caches dso data DSO__DATA_CACHE_SIZE size chunks
 * in the rb_tree. Any read to already cached data is served
 * by cached data.
 */
static ssize_t cached_read(struct dso *dso, u64 offset, u8 *data, ssize_t size)
static ssize_t cached_read(struct dso *dso, u64 offset, u8 *data, ssize_t size)
{
{
	ssize_t r = 0;
	ssize_t r = 0;
@@ -504,6 +542,17 @@ static ssize_t data_read_offset(struct dso *dso, u64 offset,
	return cached_read(dso, offset, data, size);
	return cached_read(dso, offset, data, size);
}
}


/**
 * dso__data_read_offset - Read data from dso file offset
 * @dso: dso object
 * @machine: machine object
 * @offset: file offset
 * @data: buffer to store data
 * @size: size of the @data buffer
 *
 * External interface to read data from dso file offset. Open
 * dso data file and use cached_read to get the data.
 */
ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine,
ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine,
			      u64 offset, u8 *data, ssize_t size)
			      u64 offset, u8 *data, ssize_t size)
{
{
@@ -513,6 +562,16 @@ ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine,
	return data_read_offset(dso, offset, data, size);
	return data_read_offset(dso, offset, data, size);
}
}


/**
 * dso__data_read_addr - Read data from dso address
 * @dso: dso object
 * @machine: machine object
 * @add: virtual memory address
 * @data: buffer to store data
 * @size: size of the @data buffer
 *
 * External interface to read data from dso address.
 */
ssize_t dso__data_read_addr(struct dso *dso, struct map *map,
ssize_t dso__data_read_addr(struct dso *dso, struct map *map,
			    struct machine *machine, u64 addr,
			    struct machine *machine, u64 addr,
			    u8 *data, ssize_t size)
			    u8 *data, ssize_t size)
+38 −0
Original line number Original line Diff line number Diff line
@@ -149,6 +149,44 @@ char dso__symtab_origin(const struct dso *dso);
int dso__read_binary_type_filename(const struct dso *dso, enum dso_binary_type type,
int dso__read_binary_type_filename(const struct dso *dso, enum dso_binary_type type,
				   char *root_dir, char *filename, size_t size);
				   char *root_dir, char *filename, size_t size);


/*
 * The dso__data_* external interface provides following functions:
 *   dso__data_fd
 *   dso__data_close
 *   dso__data_read_offset
 *   dso__data_read_addr
 *
 * Please refer to the dso.c object code for each function and
 * arguments documentation. Following text tries to explain the
 * dso file descriptor caching.
 *
 * The dso__data* interface allows caching of opened file descriptors
 * to speed up the dso data accesses. The idea is to leave the file
 * descriptor opened ideally for the whole life of the dso object.
 *
 * The current usage of the dso__data_* interface is as follows:
 *
 * Get DSO's fd:
 *   int fd = dso__data_fd(dso, machine);
 *   USE 'fd' SOMEHOW
 *
 * Read DSO's data:
 *   n = dso__data_read_offset(dso_0, &machine, 0, buf, BUFSIZE);
 *   n = dso__data_read_addr(dso_0, &machine, 0, buf, BUFSIZE);
 *
 * Eventually close DSO's fd:
 *   dso__data_close(dso);
 *
 * It is not necessary to close the DSO object data file. Each time new
 * DSO data file is opened, the limit (RLIMIT_NOFILE/2) is checked. Once
 * it is crossed, the oldest opened DSO object is closed.
 *
 * The dso__delete function calls close_dso function to ensure the
 * data file descriptor gets closed/unmapped before the dso object
 * is freed.
 *
 * TODO
*/
int dso__data_fd(struct dso *dso, struct machine *machine);
int dso__data_fd(struct dso *dso, struct machine *machine);
void dso__data_close(struct dso *dso);
void dso__data_close(struct dso *dso);