-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
perf tools: Add perf_data_file__open interface to data object
Adding perf_data_file__open interface to data object to open the perf.data file for both read and write. Signed-off-by: Jiri Olsa <jolsa@redhat.com> Acked-by: Namhyung Kim <namhyung@kernel.org> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Andi Kleen <andi@firstfloor.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@elte.hu> 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/1381847254-28809-3-git-send-email-jolsa@redhat.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
- Loading branch information
Jiri Olsa
authored and
Arnaldo Carvalho de Melo
committed
Oct 21, 2013
1 parent
f5fc141
commit 6a4d98d
Showing
7 changed files
with
158 additions
and
107 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,120 @@ | ||
#include <linux/compiler.h> | ||
#include <linux/kernel.h> | ||
#include <sys/types.h> | ||
#include <sys/stat.h> | ||
#include <unistd.h> | ||
#include <string.h> | ||
|
||
#include "data.h" | ||
#include "util.h" | ||
|
||
static bool check_pipe(struct perf_data_file *file) | ||
{ | ||
struct stat st; | ||
bool is_pipe = false; | ||
int fd = perf_data_file__is_read(file) ? | ||
STDIN_FILENO : STDOUT_FILENO; | ||
|
||
if (!file->path) { | ||
if (!fstat(fd, &st) && S_ISFIFO(st.st_mode)) | ||
is_pipe = true; | ||
} else { | ||
if (!strcmp(file->path, "-")) | ||
is_pipe = true; | ||
} | ||
|
||
if (is_pipe) | ||
file->fd = fd; | ||
|
||
return file->is_pipe = is_pipe; | ||
} | ||
|
||
static int check_backup(struct perf_data_file *file) | ||
{ | ||
struct stat st; | ||
|
||
if (!stat(file->path, &st) && st.st_size) { | ||
/* TODO check errors properly */ | ||
char oldname[PATH_MAX]; | ||
snprintf(oldname, sizeof(oldname), "%s.old", | ||
file->path); | ||
unlink(oldname); | ||
rename(file->path, oldname); | ||
} | ||
|
||
return 0; | ||
} | ||
|
||
static int open_file_read(struct perf_data_file *file) | ||
{ | ||
struct stat st; | ||
int fd; | ||
|
||
fd = open(file->path, O_RDONLY); | ||
if (fd < 0) { | ||
int err = errno; | ||
|
||
pr_err("failed to open %s: %s", file->path, strerror(err)); | ||
if (err == ENOENT && !strcmp(file->path, "perf.data")) | ||
pr_err(" (try 'perf record' first)"); | ||
pr_err("\n"); | ||
return -err; | ||
} | ||
|
||
if (fstat(fd, &st) < 0) | ||
goto out_close; | ||
|
||
if (!file->force && st.st_uid && (st.st_uid != geteuid())) { | ||
pr_err("file %s not owned by current user or root\n", | ||
file->path); | ||
goto out_close; | ||
} | ||
|
||
if (!st.st_size) { | ||
pr_info("zero-sized file (%s), nothing to do!\n", | ||
file->path); | ||
goto out_close; | ||
} | ||
|
||
file->size = st.st_size; | ||
return fd; | ||
|
||
out_close: | ||
close(fd); | ||
return -1; | ||
} | ||
|
||
static int open_file_write(struct perf_data_file *file) | ||
{ | ||
if (check_backup(file)) | ||
return -1; | ||
|
||
return open(file->path, O_CREAT|O_RDWR|O_TRUNC, S_IRUSR|S_IWUSR); | ||
} | ||
|
||
static int open_file(struct perf_data_file *file) | ||
{ | ||
int fd; | ||
|
||
fd = perf_data_file__is_read(file) ? | ||
open_file_read(file) : open_file_write(file); | ||
|
||
file->fd = fd; | ||
return fd < 0 ? -1 : 0; | ||
} | ||
|
||
int perf_data_file__open(struct perf_data_file *file) | ||
{ | ||
if (check_pipe(file)) | ||
return 0; | ||
|
||
if (!file->path) | ||
file->path = "perf.data"; | ||
|
||
return open_file(file); | ||
} | ||
|
||
void perf_data_file__close(struct perf_data_file *file) | ||
{ | ||
close(file->fd); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters