Messages in this thread |  | | Date | Tue, 29 Dec 2020 10:45:24 +0100 | From | Jiri Olsa <> | Subject | Re: [PATCH] perf tools: Detect when pipe is passed as perf data |
| |
On Tue, Dec 29, 2020 at 02:53:36PM +0900, Namhyung Kim wrote: > On Sat, Dec 26, 2020 at 7:21 AM Jiri Olsa <jolsa@kernel.org> wrote: > > > > Currently we allow pipe input/output only through '-' string > > being passed to '-o' or '-i' options, like: > > > > # mkfifo perf.pipe > > # perf record --no-buffering -e 'sched:sched_switch' -o - > perf.pipe & > > [1] 354406 > > # cat perf.pipe | ./perf --no-pager script -i - | head -3 > > perf 354406 [000] 168190.164921: sched:sched_switch: perf:354406.. > > migration/0 12 [000] 168190.164928: sched:sched_switch: migration/0:.. > > perf 354406 [001] 168190.164981: sched:sched_switch: perf:354406.. > > ... > > > > This patch detects if given path is pipe and set the perf data > > object accordingly, so it's possible now to do above with: > > > > # mkfifo perf.pipe > > # perf record --no-buffering -e 'sched:sched_switch' -o perf.pipe & > > [1] 360188 > > # perf --no-pager script -i ./perf.pipe | head -3 > > perf 354442 [000] 168275.464895: sched:sched_switch: perf:354442.. > > migration/0 12 [000] 168275.464902: sched:sched_switch: migration/0:.. > > perf 354442 [001] 168275.464953: sched:sched_switch: perf:354442.. > > > > It's of course possible to combine any of above ways. > > > > Signed-off-by: Jiri Olsa <jolsa@kernel.org> > > --- > > tools/perf/util/data.c | 27 +++++++++++++++++++++------ > > 1 file changed, 21 insertions(+), 6 deletions(-) > > > > diff --git a/tools/perf/util/data.c b/tools/perf/util/data.c > > index f29af4fc3d09..767b6c903cf5 100644 > > --- a/tools/perf/util/data.c > > +++ b/tools/perf/util/data.c > > @@ -159,7 +159,7 @@ int perf_data__update_dir(struct perf_data *data) > > return 0; > > } > > > > -static bool check_pipe(struct perf_data *data) > > +static int check_pipe(struct perf_data *data) > > { > > struct stat st; > > bool is_pipe = false; > > @@ -172,6 +172,15 @@ static bool check_pipe(struct perf_data *data) > > } else { > > if (!strcmp(data->path, "-")) > > is_pipe = true; > > + else if (!stat(data->path, &st) && S_ISFIFO(st.st_mode)) { > > + int flags = perf_data__is_read(data) ? > > + O_RDONLY : O_WRONLY|O_CREAT|O_TRUNC; > > I don't think we need O_CREAT here (maybe O_TRUNC as well).
I copied that from bash opening write end like: openat(AT_FDCWD, "perf.pipe", O_WRONLY|O_CREAT|O_TRUNC, 0666 <detached ...>
however I can't see any check on kernel side for that, so it can removed.. I'll send new version
thanks, jirka
|  |