Skip to content

Commit

Permalink
perf machine: Fix the lifetime of the VDSO temporary file
Browse files Browse the repository at this point in the history
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: Jiri Olsa <jolsa@redhat.com>
Signed-off-by: Adrian 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.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
  • Loading branch information
Adrian Hunter authored and Arnaldo Carvalho de Melo committed Jul 23, 2014
1 parent 30f4f81 commit d027b64
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 13 deletions.
4 changes: 4 additions & 0 deletions tools/perf/util/machine.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include "sort.h"
#include "strlist.h"
#include "thread.h"
#include "vdso.h"
#include <stdbool.h>
#include <symbol/kallsyms.h>
#include "unwind.h"
Expand All @@ -23,6 +24,8 @@ int machine__init(struct machine *machine, const char *root_dir, pid_t pid)
INIT_LIST_HEAD(&machine->dead_threads);
machine->last_match = NULL;

machine->vdso_info = NULL;

machine->kmaps.machine = machine;
machine->pid = pid;

Expand Down Expand Up @@ -105,6 +108,7 @@ void machine__exit(struct machine *machine)
map_groups__exit(&machine->kmaps);
dsos__delete(&machine->user_dsos);
dsos__delete(&machine->kernel_dsos);
vdso__exit(machine);
zfree(&machine->root_dir);
zfree(&machine->current_tid);
}
Expand Down
3 changes: 3 additions & 0 deletions tools/perf/util/machine.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ union perf_event;

extern const char *ref_reloc_sym_names[];

struct vdso_info;

struct machine {
struct rb_node rb_node;
pid_t pid;
Expand All @@ -28,6 +30,7 @@ struct machine {
struct rb_root threads;
struct list_head dead_threads;
struct thread *last_match;
struct vdso_info *vdso_info;
struct list_head user_dsos;
struct list_head kernel_dsos;
struct map_groups kmaps;
Expand Down
2 changes: 0 additions & 2 deletions tools/perf/util/session.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
#include "util.h"
#include "cpumap.h"
#include "perf_regs.h"
#include "vdso.h"

static int perf_session__open(struct perf_session *session)
{
Expand Down Expand Up @@ -156,7 +155,6 @@ void perf_session__delete(struct perf_session *session)
if (session->file)
perf_data_file__close(session->file);
free(session);
vdso__exit();
}

static int process_event_synth_tracing_data_stub(struct perf_tool *tool
Expand Down
39 changes: 29 additions & 10 deletions tools/perf/util/vdso.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,17 @@ 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 struct vdso_info *vdso_info__new(void)
{
static const struct vdso_info vdso_info_init = {
.vdso = {
.temp_file_name = VDSO__TEMP_FILE_NAME,
.dso_name = VDSO__MAP_NAME,
},
};

return memdup(&vdso_info_init, sizeof(vdso_info_init));
}

static int find_vdso_map(void **start, void **end)
{
Expand Down Expand Up @@ -105,16 +108,32 @@ static char *get_file(struct vdso_file *vdso_file)
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)
unlink(vdso_info->vdso.temp_file_name);

zfree(&machine->vdso_info);
}

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) {
char *file;

Expand Down
2 changes: 1 addition & 1 deletion tools/perf/util/vdso.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,6 @@ static inline bool is_vdso_map(const char *filename)
struct machine;

struct dso *vdso__dso_findnew(struct machine *machine);
void vdso__exit(void);
void vdso__exit(struct machine *machine);

#endif /* __PERF_VDSO__ */

0 comments on commit d027b64

Please sign in to comment.