Commit d027b640 authored by Adrian Hunter's avatar Adrian Hunter Committed by Arnaldo Carvalho de Melo

perf machine: Fix the lifetime of the VDSO temporary file

The VDSO temporary file is unlinked when a session is deleted.  That
precludes the possibilities that there is no session or there is more
than one session.

Correctly the vdso belongs to the machine so put the information on
'struct machine' and get rid of the global variables.
Reviewed-by: default avatarJiri Olsa <jolsa@redhat.com>
Signed-off-by: default avatarAdrian 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/53CF9B14.7040408@intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 30f4f815
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "sort.h" #include "sort.h"
#include "strlist.h" #include "strlist.h"
#include "thread.h" #include "thread.h"
#include "vdso.h"
#include <stdbool.h> #include <stdbool.h>
#include <symbol/kallsyms.h> #include <symbol/kallsyms.h>
#include "unwind.h" #include "unwind.h"
...@@ -23,6 +24,8 @@ int machine__init(struct machine *machine, const char *root_dir, pid_t pid) ...@@ -23,6 +24,8 @@ int machine__init(struct machine *machine, const char *root_dir, pid_t pid)
INIT_LIST_HEAD(&machine->dead_threads); INIT_LIST_HEAD(&machine->dead_threads);
machine->last_match = NULL; machine->last_match = NULL;
machine->vdso_info = NULL;
machine->kmaps.machine = machine; machine->kmaps.machine = machine;
machine->pid = pid; machine->pid = pid;
...@@ -105,6 +108,7 @@ void machine__exit(struct machine *machine) ...@@ -105,6 +108,7 @@ void machine__exit(struct machine *machine)
map_groups__exit(&machine->kmaps); map_groups__exit(&machine->kmaps);
dsos__delete(&machine->user_dsos); dsos__delete(&machine->user_dsos);
dsos__delete(&machine->kernel_dsos); dsos__delete(&machine->kernel_dsos);
vdso__exit(machine);
zfree(&machine->root_dir); zfree(&machine->root_dir);
zfree(&machine->current_tid); zfree(&machine->current_tid);
} }
......
...@@ -20,6 +20,8 @@ union perf_event; ...@@ -20,6 +20,8 @@ union perf_event;
extern const char *ref_reloc_sym_names[]; extern const char *ref_reloc_sym_names[];
struct vdso_info;
struct machine { struct machine {
struct rb_node rb_node; struct rb_node rb_node;
pid_t pid; pid_t pid;
...@@ -28,6 +30,7 @@ struct machine { ...@@ -28,6 +30,7 @@ struct machine {
struct rb_root threads; struct rb_root threads;
struct list_head dead_threads; struct list_head dead_threads;
struct thread *last_match; struct thread *last_match;
struct vdso_info *vdso_info;
struct list_head user_dsos; struct list_head user_dsos;
struct list_head kernel_dsos; struct list_head kernel_dsos;
struct map_groups kmaps; struct map_groups kmaps;
......
...@@ -14,7 +14,6 @@ ...@@ -14,7 +14,6 @@
#include "util.h" #include "util.h"
#include "cpumap.h" #include "cpumap.h"
#include "perf_regs.h" #include "perf_regs.h"
#include "vdso.h"
static int perf_session__open(struct perf_session *session) static int perf_session__open(struct perf_session *session)
{ {
...@@ -156,7 +155,6 @@ void perf_session__delete(struct perf_session *session) ...@@ -156,7 +155,6 @@ void perf_session__delete(struct perf_session *session)
if (session->file) if (session->file)
perf_data_file__close(session->file); perf_data_file__close(session->file);
free(session); free(session);
vdso__exit();
} }
static int process_event_synth_tracing_data_stub(struct perf_tool *tool static int process_event_synth_tracing_data_stub(struct perf_tool *tool
......
...@@ -28,14 +28,17 @@ struct vdso_info { ...@@ -28,14 +28,17 @@ struct vdso_info {
struct vdso_file vdso; struct vdso_file vdso;
}; };
static struct vdso_info vdso_info_ = { static struct vdso_info *vdso_info__new(void)
{
static const struct vdso_info vdso_info_init = {
.vdso = { .vdso = {
.temp_file_name = VDSO__TEMP_FILE_NAME, .temp_file_name = VDSO__TEMP_FILE_NAME,
.dso_name = VDSO__MAP_NAME, .dso_name = VDSO__MAP_NAME,
}, },
}; };
static struct vdso_info *vdso_info = &vdso_info_; return memdup(&vdso_info_init, sizeof(vdso_info_init));
}
static int find_vdso_map(void **start, void **end) static int find_vdso_map(void **start, void **end)
{ {
...@@ -105,16 +108,32 @@ static char *get_file(struct vdso_file *vdso_file) ...@@ -105,16 +108,32 @@ static char *get_file(struct vdso_file *vdso_file)
return vdso; return vdso;
} }
void vdso__exit(void) void vdso__exit(struct machine *machine)
{ {
struct vdso_info *vdso_info = machine->vdso_info;
if (!vdso_info)
return;
if (vdso_info->vdso.found) if (vdso_info->vdso.found)
unlink(vdso_info->vdso.temp_file_name); unlink(vdso_info->vdso.temp_file_name);
zfree(&machine->vdso_info);
} }
struct dso *vdso__dso_findnew(struct machine *machine) struct dso *vdso__dso_findnew(struct machine *machine)
{ {
struct dso *dso = dsos__find(&machine->user_dsos, VDSO__MAP_NAME, true); struct vdso_info *vdso_info;
struct dso *dso;
if (!machine->vdso_info)
machine->vdso_info = vdso_info__new();
vdso_info = machine->vdso_info;
if (!vdso_info)
return NULL;
dso = dsos__find(&machine->user_dsos, VDSO__MAP_NAME, true);
if (!dso) { if (!dso) {
char *file; char *file;
......
...@@ -15,6 +15,6 @@ static inline bool is_vdso_map(const char *filename) ...@@ -15,6 +15,6 @@ static inline bool is_vdso_map(const char *filename)
struct machine; struct machine;
struct dso *vdso__dso_findnew(struct machine *machine); struct dso *vdso__dso_findnew(struct machine *machine);
void vdso__exit(void); void vdso__exit(struct machine *machine);
#endif /* __PERF_VDSO__ */ #endif /* __PERF_VDSO__ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment