perf tools: Add dso__data_* interface descriptons
Adding descriptions/explanations for dso__data_* interface functions. Acked-by: Namhyung 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: Jiri Olsa <jolsa@kernel.org>
This commit is contained in:
parent
a08cae03f4
commit
c1f9aa0a61
|
@ -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)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue