Messages in this thread | | | From | Arnaldo Carvalho de Melo <> | Date | Mon, 25 Feb 2019 10:45:48 -0300 | Subject | Re: [PATCH 10/20] perf data: Add directory support |
| |
Em Sun, Feb 24, 2019 at 08:06:46PM +0100, Jiri Olsa escreveu: > Adding support to have directory as perf.data. > > The caller needs to set 'struct perf_data::is_dir flag > and the path will be treated as directory. > > The 'struct perf_data::file' is initialized and open > as 'path/header' file. > > Adding check to direcory interface functions to check > on is_dir flag. > > Link: http://lkml.kernel.org/n/tip-pvot1aywiem9epgqpfi1agaj@git.kernel.org > Signed-off-by: Jiri Olsa <jolsa@kernel.org> > --- > tools/perf/util/data.c | 41 ++++++++++++++++++++++++++++++++++++++- > tools/perf/util/data.h | 6 ++++++ > tools/perf/util/session.c | 4 ++++ > 3 files changed, 50 insertions(+), 1 deletion(-) > > diff --git a/tools/perf/util/data.c b/tools/perf/util/data.c > index 7bd5ddeb7a41..72ac4dbb5c69 100644 > --- a/tools/perf/util/data.c > +++ b/tools/perf/util/data.c > @@ -34,6 +34,9 @@ int perf_data__create_dir(struct perf_data *data, int nr) > struct perf_data_file *files = NULL; > int i, ret = -1; > > + if (WARN_ON(!data->is_dir)) > + return -EINVAL; > + > files = zalloc(nr * sizeof(*files)); > if (!files) > return -ENOMEM; > @@ -69,6 +72,9 @@ int perf_data__open_dir(struct perf_data *data) > DIR *dir; > int nr = 0; > > + if (WARN_ON(!data->is_dir)) > + return -EINVAL; > + > dir = opendir(data->path); > if (!dir) > return -EINVAL; > @@ -173,6 +179,16 @@ static int check_backup(struct perf_data *data) > return 0; > } > > +static bool is_dir(struct perf_data *data) > +{ > + struct stat st; > + > + if (stat(data->path, &st)) > + return false; > + > + return (st.st_mode & S_IFMT) == S_IFDIR; > +} > + > static int open_file_read(struct perf_data *data) > { > struct stat st; > @@ -254,6 +270,22 @@ static int open_file_dup(struct perf_data *data) > return open_file(data); > } > > +static int open_dir(struct perf_data *data) > +{ > + if (perf_data__is_write(data) && > + mkdir(data->path, S_IRWXU) < 0) > + return -1; > + > + /* > + * So far we open only the header, so we > + * can read the data version and layout. > + */ > + if (asprintf(&data->file.path, "%s/header", data->path) < 0) > + return -ENOMEM;
so, if this fails, then we should unwind the mkdir, if it was performed, so that we leave things as they were before calling open_dir(), right?
I processed everything up to here.
- Arnaldo
> + > + return open_file(data); > +} > + > int perf_data__open(struct perf_data *data) > { > if (check_pipe(data)) > @@ -265,11 +297,18 @@ int perf_data__open(struct perf_data *data) > if (check_backup(data)) > return -1; > > - return open_file_dup(data); > + if (perf_data__is_read(data)) > + data->is_dir = is_dir(data); > + > + return perf_data__is_dir(data) ? > + open_dir(data) : open_file_dup(data); > } > > void perf_data__close(struct perf_data *data) > { > + if (perf_data__is_dir(data)) > + perf_data__close_dir(data); > + > free(data->file.path); > close(data->file.fd); > } > diff --git a/tools/perf/util/data.h b/tools/perf/util/data.h > index 14b47be2bd69..06aefeda311f 100644 > --- a/tools/perf/util/data.h > +++ b/tools/perf/util/data.h > @@ -19,6 +19,7 @@ struct perf_data { > const char *path; > struct perf_data_file file; > bool is_pipe; > + bool is_dir; > bool force; > enum perf_data_mode mode; > > @@ -43,6 +44,11 @@ static inline int perf_data__is_pipe(struct perf_data *data) > return data->is_pipe; > } > > +static inline bool perf_data__is_dir(struct perf_data *data) > +{ > + return data->is_dir; > +} > + > static inline int perf_data__fd(struct perf_data *data) > { > return data->file.fd; > diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c > index c764bbc91009..9991e9a8bc12 100644 > --- a/tools/perf/util/session.c > +++ b/tools/perf/util/session.c > @@ -152,6 +152,10 @@ struct perf_session *perf_session__new(struct perf_data *data, > } > > perf_evlist__init_trace_event_sample_raw(session->evlist); > + > + /* Open the directory data. */ > + if (data->is_dir && perf_data__open_dir(data)) > + goto out_close; > } > } else { > session->machines.host.env = &perf_env; > -- > 2.17.2
--
- Arnaldo
| |