All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Ian Rogers" <irogers@google.com>
Cc: linux-perf-users@vger.kernel.org
Subject: Re: [PATCH v10 15/20] perf intel-tpebs: Fix race in tpebs_stop() and tpebs_cmd.out fd handling
Date: Fri, 06 Nov 2026 07:27:34 +0000	[thread overview]
Message-ID: <sashiko-outbox-200994@kernel.org> (raw)
In-Reply-To: <20261106070344.329897-16-irogers@google.com>

Thank you for your contribution! Sashiko AI review found 1 potential
issue to consider:
- [Medium] perf intel-tpebs: race between evsel__tpebs_open() cleanup
  and tpebs_stop()
--

commit 7a1ce986169f6d07b45e9adbf7d1dd00eff88dbc
Author: Ian Rogers <irogers@google.com>

perf intel-tpebs: Fix race in tpebs_stop() and tpebs_cmd.out fd handling

This commit fixes a race on tpebs_reader_thread in tpebs_stop(), transfers
tpebs_cmd.out ownership to __sample_reader(), cleans up tpebs_cmd and
tpebs_reader_thread on error paths, and adds explicit header includes.

> diff --git a/tools/perf/util/intel-tpebs.c b/tools/perf/util/intel-tpebs.c
> index 7c0b8b15bd10e..47c939fc2058c 100644
> --- a/tools/perf/util/intel-tpebs.c
> +++ b/tools/perf/util/intel-tpebs.c
[ ... ]
> @@ -567,12 +588,15 @@ int evsel__tpebs_open(struct evsel *evsel)
>  			goto out;
>  
>  		if (pthread_create(&tpebs_reader_thread, /*attr=*/NULL, __sample_reader,
> -				   /*arg=*/NULL)) {
> +				   (void *)(intptr_t)tpebs_cmd.out)) {
>  			kill(tpebs_cmd.pid, SIGTERM);
>  			pr_err("Could not create thread to process sample data.\n");
>  			ret = -1;
>  			goto out;
>  		}
> +		/* __sample_reader now owns and closes the output fd. */
> +		tpebs_cmd.out = -1;
> +		started_thread = true;
>  		ret = tpebs_send_record_cmd(EVLIST_CTL_CMD_ENABLE_TAG);
>  	}
>  out:
> @@ -586,9 +610,22 @@ int evsel__tpebs_open(struct evsel *evsel)
>  
>  		if (started_process) {
>  			if (tpebs_cmd.pid > 0) {
> -				kill(tpebs_cmd.pid, SIGTERM);
> +				pid_t actual_pid = tpebs_cmd.pid;
> +
> +				tpebs_stopping = true;
> +				kill(actual_pid, SIGTERM);
> +				tpebs_cmd.pid = 0;
> +				if (started_thread) {
> +					pthread_t reader_thread = tpebs_reader_thread;
> +
> +					mutex_unlock(tpebs_mtx_get());
> +					pthread_join(reader_thread, NULL);
> +					mutex_lock(tpebs_mtx_get());
> +				}
> +				tpebs_cmd.pid = actual_pid;
>  				finish_command(&tpebs_cmd);
>  				tpebs_cmd.pid = 0;
> +				tpebs_stopping = false;
>  			}

[Severity: Medium]
Can this error path race with tpebs_stop() and call pthread_join() twice on
the same reader_thread?

tpebs_send_record_cmd() drops tpebs_mtx while writing the command and
polling ack_fd[0].  During that window a concurrent evsel__tpebs_close()
can enter tpebs_stop(), which also drops tpebs_mtx inside
tpebs_send_record_cmd() before clearing tpebs_cmd.pid:

CPU0                                  CPU1
evsel__tpebs_open()
  started_process = true
  started_thread = true
  tpebs_send_record_cmd(ENABLE)
    mutex_unlock(tpebs_mtx)
                                      evsel__tpebs_close()
                                        tpebs_stop()
                                          tpebs_stopping = true
                                          tpebs_send_record_cmd(STOP)
                                            mutex_unlock(tpebs_mtx)
    mutex_lock(tpebs_mtx)
  if (started_process)
    if (tpebs_cmd.pid > 0)
      reader_thread = tpebs_reader_thread
      tpebs_cmd.pid = 0
      mutex_unlock(tpebs_mtx)
      pthread_join(reader_thread)
                                            mutex_lock(tpebs_mtx)
                                          reader_thread = tpebs_reader_thread
                                          mutex_unlock(tpebs_mtx)
                                          pthread_join(reader_thread)
                                            <-- double pthread_join()

Both threads then also restore tpebs_cmd.pid = actual_pid and call
finish_command(&tpebs_cmd).  Even if tpebs_stop() has already cleared
tpebs_cmd.pid = 0 and is unlocked inside pthread_join(), the
started_process block still closes control_fd and ack_fd underneath it.

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20261106070344.329897-1-irogers@google.com?part=15

  reply	other threads:[~2026-11-06  7:27 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-06  7:03 [PATCH v10 00/20] tools/perf: Adopt kernel compiler-context-analysis.h annotations Ian Rogers
2026-11-06  7:03 ` [PATCH v10 01/20] compiler-context-analysis: Avoid unused parameter warning in _context_unsafe_alias() Ian Rogers
2026-11-06  7:09   ` sashiko-bot
2026-11-06 18:22   ` Bart Van Assche
2026-11-06  7:03 ` [PATCH v10 02/20] tools headers compiler: Synchronize compiler_types.h with the kernel sources Ian Rogers
2026-11-06  7:13   ` sashiko-bot
2026-11-06  7:03 ` [PATCH v10 03/20] tools headers: Synchronize linux/compiler-context-analysis.h " Ian Rogers
2026-11-06  7:10   ` sashiko-bot
2026-11-06  7:03 ` [PATCH v10 04/20] perf mutex: Use kernel style compiler-context-analysis.h annotations Ian Rogers
2026-11-06  7:14   ` sashiko-bot
2026-11-06  7:03 ` [PATCH v10 05/20] perf build: Enable additional Clang thread-safety flags Ian Rogers
2026-11-06  7:13   ` sashiko-bot
2026-11-06  7:03 ` [PATCH v10 06/20] perf comm: Add __guarded_by annotations to struct comm_strs Ian Rogers
2026-11-06  7:10   ` sashiko-bot
2026-11-06  7:03 ` [PATCH v10 07/20] perf vdso: Fix unlocked __dsos__add() and race in __machine__addnew_vdso() Ian Rogers
2026-11-06  7:11   ` sashiko-bot
2026-11-06  7:03 ` [PATCH v10 08/20] perf dsos: Skip BPF and OOL DSOs in dsos__find_kernel_dso() Ian Rogers
2026-11-06  7:17   ` sashiko-bot
2026-11-06  7:03 ` [PATCH v10 09/20] perf dsos: Ensure DSOs in auxtrace, machine, and symbol are in dsos Ian Rogers
2026-11-06  7:19   ` sashiko-bot
2026-11-06  7:03 ` [PATCH v10 10/20] perf dso: Pass dso_data to close_data_fd() and dso__list_del() Ian Rogers
2026-11-06  7:10   ` sashiko-bot
2026-11-06  7:03 ` [PATCH v10 11/20] perf dso: Use DEFINE_MUTEX for dso__data_open_lock Ian Rogers
2026-11-06  7:07   ` sashiko-bot
2026-11-06  7:03 ` [PATCH v10 12/20] perf dsos: Use read lock fast path in dsos__findnew_id() Ian Rogers
2026-11-06  7:09   ` sashiko-bot
2026-11-06  7:03 ` [PATCH v10 13/20] perf dso: Expand context analysis annotations Ian Rogers
2026-11-06  7:11   ` sashiko-bot
2026-11-06  7:03 ` [PATCH v10 14/20] perf thread: Expand context analysis annotations to threads and namespaces_lock Ian Rogers
2026-11-06  7:12   ` sashiko-bot
2026-11-06  7:03 ` [PATCH v10 15/20] perf intel-tpebs: Fix race in tpebs_stop() and tpebs_cmd.out fd handling Ian Rogers
2026-11-06  7:27   ` sashiko-bot [this message]
2026-11-06  7:03 ` [PATCH v10 16/20] perf intel-tpebs: Use DEFINE_MUTEX for tpebs_mtx Ian Rogers
2026-11-06  7:12   ` sashiko-bot
2026-11-06  7:03 ` [PATCH v10 17/20] perf config, intel-tpebs, env: Add __guarded_by and __must_hold annotations Ian Rogers
2026-11-06  7:15   ` sashiko-bot
2026-11-06  7:03 ` [PATCH v10 18/20] perf maps: Fix lock inversion in maps__load_first() Ian Rogers
2026-11-06  7:21   ` sashiko-bot
2026-11-06  7:03 ` [PATCH v10 19/20] perf maps: Fix map index lookup fallback and removal Ian Rogers
2026-11-06  7:17   ` sashiko-bot
2026-11-06  7:03 ` [PATCH v10 20/20] perf maps: Add context analysis annotations Ian Rogers
2026-11-06  7:13   ` sashiko-bot

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=sashiko-outbox-200994@kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=irogers@google.com \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.