[3/4] perf session: Avoid calling lseek(2) for pipe

Message ID 20230127001951.3432374-4-namhyung@kernel.org
State New
Headers
Series perf intel-pt: Fix the pipe mode (v1) |

Commit Message

Namhyung Kim Jan. 27, 2023, 12:19 a.m. UTC
  We should not call lseek(2) for pipes as it won't work.  And we already
in the proper place to read the data for AUXTRACE.  Add the comment like
in the PERF_RECORD_HEADER_TRACING_DATA.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 tools/perf/util/session.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)
  

Comments

James Clark Jan. 27, 2023, 3:34 p.m. UTC | #1
On 27/01/2023 00:19, Namhyung Kim wrote:
> We should not call lseek(2) for pipes as it won't work.  And we already
> in the proper place to read the data for AUXTRACE.  Add the comment like
> in the PERF_RECORD_HEADER_TRACING_DATA.
> 
> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
> ---
>  tools/perf/util/session.c | 9 +++++++--
>  1 file changed, 7 insertions(+), 2 deletions(-)
> 
> diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
> index 7c021c6cedb9..fdfe772f2699 100644
> --- a/tools/perf/util/session.c
> +++ b/tools/perf/util/session.c
> @@ -1699,8 +1699,13 @@ static s64 perf_session__process_user_event(struct perf_session *session,
>  	case PERF_RECORD_AUXTRACE_INFO:
>  		return tool->auxtrace_info(session, event);
>  	case PERF_RECORD_AUXTRACE:
> -		/* setup for reading amidst mmap */
> -		lseek(fd, file_offset + event->header.size, SEEK_SET);
> +		/*
> +		 * Setup for reading amidst mmap, but only when we
> +		 * are in 'file' mode.  The 'pipe' fd is in proper
> +		 * place already.
> +		 */
> +		if (!perf_data__is_pipe(session->data))
> +			lseek(fd, file_offset + event->header.size, SEEK_SET);

I'm not sure if it means anything, but Arm SPE works both with and
without this change, although I did have to skip the build-id inject part:

  perf record -o- -e arm_spe// stress -c 1 -t 1 | \
    perf report -i- --itrace=i1000


>  		return tool->auxtrace(session, event);
>  	case PERF_RECORD_AUXTRACE_ERROR:
>  		perf_session__auxtrace_error_inc(session, event);
  

Patch

diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 7c021c6cedb9..fdfe772f2699 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -1699,8 +1699,13 @@  static s64 perf_session__process_user_event(struct perf_session *session,
 	case PERF_RECORD_AUXTRACE_INFO:
 		return tool->auxtrace_info(session, event);
 	case PERF_RECORD_AUXTRACE:
-		/* setup for reading amidst mmap */
-		lseek(fd, file_offset + event->header.size, SEEK_SET);
+		/*
+		 * Setup for reading amidst mmap, but only when we
+		 * are in 'file' mode.  The 'pipe' fd is in proper
+		 * place already.
+		 */
+		if (!perf_data__is_pipe(session->data))
+			lseek(fd, file_offset + event->header.size, SEEK_SET);
 		return tool->auxtrace(session, event);
 	case PERF_RECORD_AUXTRACE_ERROR:
 		perf_session__auxtrace_error_inc(session, event);