提交 30f4f815 编写于 作者: A Adrian Hunter 提交者: Arnaldo Carvalho de Melo

perf tools: Group VDSO global variables into a structure

This is preparation for removing the global variables used in vdso.c and
thereby fixing the lifetime of the VDSO temporary file.

Also allowance is made for the later addition of support for compat
VDSOs.
Reviewed-by: NJiri Olsa <jolsa@redhat.com>
Signed-off-by: NAdrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1406035081-14301-46-git-send-email-adrian.hunter@intel.comSigned-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
上级 d5652d86
......@@ -15,8 +15,27 @@
#include "linux/string.h"
#include "debug.h"
static bool vdso_found;
static char vdso_file[] = "/tmp/perf-vdso.so-XXXXXX";
#define VDSO__TEMP_FILE_NAME "/tmp/perf-vdso.so-XXXXXX"
struct vdso_file {
bool found;
bool error;
char temp_file_name[sizeof(VDSO__TEMP_FILE_NAME)];
const char *dso_name;
};
struct vdso_info {
struct vdso_file vdso;
};
static struct vdso_info vdso_info_ = {
.vdso = {
.temp_file_name = VDSO__TEMP_FILE_NAME,
.dso_name = VDSO__MAP_NAME,
},
};
static struct vdso_info *vdso_info = &vdso_info_;
static int find_vdso_map(void **start, void **end)
{
......@@ -49,7 +68,7 @@ static int find_vdso_map(void **start, void **end)
return !found;
}
static char *get_file(void)
static char *get_file(struct vdso_file *vdso_file)
{
char *vdso = NULL;
char *buf = NULL;
......@@ -57,10 +76,10 @@ static char *get_file(void)
size_t size;
int fd;
if (vdso_found)
return vdso_file;
if (vdso_file->found)
return vdso_file->temp_file_name;
if (find_vdso_map(&start, &end))
if (vdso_file->error || find_vdso_map(&start, &end))
return NULL;
size = end - start;
......@@ -69,26 +88,27 @@ static char *get_file(void)
if (!buf)
return NULL;
fd = mkstemp(vdso_file);
fd = mkstemp(vdso_file->temp_file_name);
if (fd < 0)
goto out;
if (size == (size_t) write(fd, buf, size))
vdso = vdso_file;
vdso = vdso_file->temp_file_name;
close(fd);
out:
free(buf);
vdso_found = (vdso != NULL);
vdso_file->found = (vdso != NULL);
vdso_file->error = !vdso_file->found;
return vdso;
}
void vdso__exit(void)
{
if (vdso_found)
unlink(vdso_file);
if (vdso_info->vdso.found)
unlink(vdso_info->vdso.temp_file_name);
}
struct dso *vdso__dso_findnew(struct machine *machine)
......@@ -98,7 +118,7 @@ struct dso *vdso__dso_findnew(struct machine *machine)
if (!dso) {
char *file;
file = get_file();
file = get_file(&vdso_info->vdso);
if (!file)
return NULL;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册