All of lore.kernel.org
 help / color / mirror / Atom feed
From: Leo Yan <leo.yan@arm.com>
To: James Clark <james.clark@linaro.org>
Cc: Suzuki K Poulose <suzuki.poulose@arm.com>,
	Mike Leach <mike.leach@arm.com>, Suyash Mahar <smahar@meta.com>,
	Yeoreum Yun <yeoreum.yun@arm.com>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Qi Liu <liuqi115@huawei.com>, Junhao He <hejunhao3@huawei.com>,
	coresight@lists.linaro.org, linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, Jonathan Cameron <jic23@kernel.org>,
	sashiko-bot <sashiko-bot@kernel.org>
Subject: Re: [PATCH v3 1/8] coresight: tmc-etr: Don't stop Perf cleanup for active sysfs reads
Date: Wed, 12 Aug 2026 17:45:32 +0100	[thread overview]
Message-ID: <20260812164532.GA313579@e132581.arm.com> (raw)
In-Reply-To: <20260728-james-cs-multiple-per-threads-v3-1-6aee7579f1dc@linaro.org>

On Tue, Jul 28, 2026 at 04:00:13PM +0100, James Clark wrote:
> The linked fixes commit deliberately allows reads of an old sysfs buffer
> while in Perf mode because they are separate software buffers. However
> it didn't modify tmc_disable_etr_sink() to match this relaxation. The
> result is that when a Perf event ends while the sysfs buffer is being
> read, clean up will be skipped.
> 
> Fix it by ignoring the sysfs_reading flag unless the active session is
> a sysfs one.

I am not clear why this is relevant to per-thread mode, maybe it would
be clear for me after reading other patches.

For this patch self, I think the issue comes from the sink buffer's life
time - SYSFS mode's buffer has longer life time than a sysfs session,
it is designed to allow reading sysfs trace data after the sysfs
session, or even during a perf session. So the code gets complex for
handling these cases.

I really think we should have a correct life time (or state machine)
for sysfs buffer, something like:

  Operations                        |  ETR sysfs buffer state machine
  ----------------------------------+-----------------------------------------
                                    |  INVALID: Init state, buffer unallocated
  echo 1 > .../tmc_etr0/enable_sink |  READY: user can read zeroed data
  echo 1 > .../etm0/enable_source   |  BUSY: user cannot read as hardware is
                                    |        writing data to buffer
  echo 0 > .../etm0/enable_source   |  READY: trace is stopped, user can read
                                    |         trace data
  echo 0 > .../tmc_etr0/enable_sink |  INVALID: buffer has been released

With the state machine's help, we might even don't need to bother what
the sink device's mode is.

> When sysfs and Perf share the same memory in ETR_MODE_RESRV mode, a new
> Perf session needs to overwrite an old inactive sysfs session by zeroing
> len. This avoids sysfs from reading stale data because it has a separate
> set of offsets in its etr_buf struct, even if that's backed by the same
> memory as the Perf one.

This can be naturally resolved if we have a state machine above?

[...]

> +static bool tmc_perf_sysfs_shared(struct tmc_drvdata *drvdata,
> +				  struct etr_buf *perf_buf)
> +{
> +	/* In ETR_MODE_RESRV mode, sysfs and Perf share the same memory. */
> +	return perf_buf &&
> +	       drvdata->sysfs_buf &&
> +	       drvdata->sysfs_buf->mode == ETR_MODE_RESRV &&
> +	       perf_buf->mode == ETR_MODE_RESRV;
> +}
> +
>  static int tmc_enable_etr_sink_perf(struct coresight_device *csdev,
>  				    struct coresight_path *path)
>  {
> @@ -1772,6 +1782,18 @@ static int tmc_enable_etr_sink_perf(struct coresight_device *csdev,
>  		goto unlock_out;
>  	}
>  
> +	/*
> +	 * Don't use if it's shared and being read by sysfs. Sysfs may only
> +	 * start reading (the cleared zero length buffer) after the first
> +	 * tmc_enable_etr_sink_perf(), which changes the result of this check,
> +	 * so it should only be done once.
> +	 */
> +	if ((drvdata->sysfs_reading &&
> +	     tmc_perf_sysfs_shared(drvdata, etr_perf->etr_buf))) {
> +		rc = -EBUSY;
> +		goto unlock_out;
> +	}

This is quite tricky. If someone reads the sysfs entry in the middle of
a perf session, and the traced task is migrated to a different CPU or
wakes up, the sink device may need to be re-enabled, however the sink
enabling could fail due to the concurrent sysfs read here.

Thanks,
Leo

  reply	other threads:[~2026-08-12 16:45 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-28 15:00 [PATCH v3 0/8] coresight: Prevent per-thread events from sharing a sink James Clark
2026-07-28 15:00 ` [PATCH v3 1/8] coresight: tmc-etr: Don't stop Perf cleanup for active sysfs reads James Clark
2026-08-12 16:45   ` Leo Yan [this message]
2026-07-28 15:00 ` [PATCH v3 2/8] coresight: configfs: Don't assume active until cscfg_mgr is set James Clark
2026-07-28 15:00 ` [PATCH v3 3/8] coresight: etm-perf: Flush workqueue before unloading module James Clark
2026-07-28 15:00 ` [PATCH v3 4/8] coresight: tmc-etr: Prevent per-thread events from sharing a sink James Clark
2026-07-28 15:00 ` [PATCH v3 5/8] coresight: tmc-etr: Use session ID for buffer ownership James Clark
2026-07-28 15:00 ` [PATCH v3 6/8] coresight: tmc-etf: Prevent per-thread events from sharing a sink James Clark
2026-07-28 15:00 ` [PATCH v3 7/8] coresight: etb10: " James Clark
2026-07-28 15:00 ` [PATCH v3 8/8] coresight: ultrasoc-smb: " James Clark

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=20260812164532.GA313579@e132581.arm.com \
    --to=leo.yan@arm.com \
    --cc=coresight@lists.linaro.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=hejunhao3@huawei.com \
    --cc=james.clark@linaro.org \
    --cc=jic23@kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=liuqi115@huawei.com \
    --cc=mike.leach@arm.com \
    --cc=sashiko-bot@kernel.org \
    --cc=smahar@meta.com \
    --cc=suzuki.poulose@arm.com \
    --cc=yeoreum.yun@arm.com \
    /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.