All of lore.kernel.org
 help / color / mirror / Atom feed
From: Steven Price <steven.price@arm.com>
To: "Adrián Larumbe" <adrian.larumbe@collabora.com>
Cc: Boris Brezillon <boris.brezillon@collabora.com>,
	Rob Herring <robh@kernel.org>,
	Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
	Maxime Ripard <mripard@kernel.org>,
	Thomas Zimmermann <tzimmermann@suse.de>,
	David Airlie <airlied@gmail.com>, Simona Vetter <simona@ffwll.ch>,
	Faith Ekstrand <faith.ekstrand@collabora.com>,
	"Marty E. Plummer" <hanetzer@startmail.com>,
	Tomeu Vizoso <tomeu@tomeuvizoso.net>,
	Eric Anholt <eric@anholt.net>,
	Robin Murphy <robin.murphy@arm.com>,
	Philipp Zabel <p.zabel@pengutronix.de>,
	dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org,
	Collabora Kernel Team <kernel@collabora.com>,
	Neil Armstrong <neil.armstrong@linaro.org>
Subject: Re: [PATCH v12 12/15] drm/panfrost: Skip cache flush/invalidate when enabling perfcnt
Date: Wed, 7 Oct 2026 14:21:39 +0100	[thread overview]
Message-ID: <c7a8c70e-9130-45dd-83dd-e7a3c591f68a@arm.com> (raw)
In-Reply-To: <179130709099.1018806.10936869787038535987.b4-reply@b4>

On 06/10/2026 18:18, Adrián Larumbe wrote:
> On 2026-10-05 16:06:02+01:00, Steven Price wrote:
>> On 05/10/2026 09:38, Boris Brezillon wrote:
>>
>>> On Fri, 2 Oct 2026 16:14:38 +0100
>>> Steven Price <steven.price@arm.com> wrote:
>>>
>>>
>>> I don't think this can happen though, because _enable_locked() is
>>> creating a BO (and its GPU mapping) just before enabling the perfcnt
>>> block, meaning the buffer is known to have no dirty cacheline pointing
>>> to it until the first dump happens. And we do flush and invalidate GPU
>>> caches after each dump, so again, we should be covered.
>>
>> The situation isn't actually a dirty cache line at the start, but a
>> stale one. We start off with the memory matching a clean line in the
>> GPU's cache. But because we don't have coherency the clean line can stay
>> even if it's inconsistent with everything else.
>>
>> CPU		|	GPU		| Memory
>> ----------------+-----------------------+--------------------
>>                 | clean line            | matches GPU cache
>> ----------------+-----------------------+--------------------
>>    CPU allocates new buffer and writes zeros
>> ----------------+-----------------------+--------------------
>> Dirty cache line| stale clean line      | unknown (cache line
>>                 |                       | might be evicted)
>> ----------------+-----------------------+--------------------
>>    CPU cleans its own cache to memory
> 
> We're not doing this explicitly for BO memory from the CPU. AFAIK the only way to
> do that manually is calling dma_sync_single_for_device() on physical addresses. I
> suppose this means the reason why the CPU can see up-to-date dump data is because
> a GPU cache flush also invalidates CPU caches for the same lines?

Without coherency between the CPU and GPU then when sharing a buffer
with the GPU there needs to be cache maintenance (otherwise the GPU
might see stale data which is still in RAM, which would be a security
hole). This is because a previous user could have mapped the data
cached. I believe this is done internally within the DMA framework.

For reading the data written by the GPU, again there needs to be cache
maintenance - a flush on the GPU and an invalidate on the CPU. However I
think we map the data on the CPU as write-combining (i.e. uncached) so
there's no need for an explicit invalidate on the CPU - the reads will
bypass the cache.

>> ----------------+-----------------------+--------------------
>> Potential clean | stale clean line      | Matches CPU
>> cache line      |                       |
>> ----------------+-----------------------+--------------------
>>    Start dump without invaliding GPU
>> ----------------+-----------------------+--------------------
>> Potential clean | GPU writes data, and  | Unknown
>> cache line      | hits in the clean line|
>>                 | even though it's stale|
>> ----------------+-----------------------+--------------------
>>    CPU flushes the GPU's cache and invalidates it's own
>> ----------------+-----------------------+--------------------
>> No-cache line   | writes out clean line | Matches GPU
>>
>>
>> Of course for the GPU to have ended up with that stale clean cache line
>> means that the physical memory was previously used for something else on
>> the GPU, so the newly allocated BO has to reuse memory from a previous
>> BO that the GPU has accessed. And it's all "unlikely" due to the small
>> size of the GPU's cache.
>>
>>>>
>>>
>>> I agree, but that's not a case we can hit in the enable path. I think I
>>> mentioned the commit message was misleading, and that we should instead
>>> talk about the fact the GPU is not supposed to have cached anything up
>>> until the first SAMPLE following a the ENABLE step.
>>>
>>>
>>> I think I was the one suggesting dropping this flush so that
>>> panfrost_perfcnt_hw_enable() (in the last patch) has one less fallible
>>> operation. Besides, I find it confusing to have a cache flush+inval in
>>> a path where the GPU is not supposed to have accessed the buffer yet
>>> (or later on, when we re-enable after a RESET, in a path where the GPU
>>> has been reset and the caches are known to be empty).
>>
>> So I agree this Should Be Safe™ because of how the driver is currently
>> using the performance counters. If we really want to drop the invalidate
>> then I think we need a comment explaining the logic. My worry is that
>> someone extends this in the future (e.g. allow selecting which counters
>> to enable) and breaks assumptions without them being documentead.
> 
> Perfcnt ioctl's are currently marked as unstable, but even so, adding the
> initial flush/invalidate back in case anyone ever wanted to redefine the
> uAPI to add support for fine-grained selection of counters shouldn't be
> much of an issue. It's just that, as things stand now, it simplifies error
> handling quite a bit, and I guess it's a reasonable trade-off.
> 
> I'll add a comment explaining why it's safe not to do the initial
> flush/invalidate in a new revision.
> 
>> We normally do perform an invalidate when the GPU first touches a buffer
>> (e.g. for a BO) - it's just normally more implicit because it's done as
>> part of the job manager(/command stream).
> 
> Does this mean instructions that are part of the command stream passed to the
> submit ioctl can trigger a flush/invalidate without CPU intervention?

Sorry, I shouldn't have mentioned command streams - that's a Panthor
thing. For Panfrost the flush/invalidate is done as part of the job
submission (FLUSH_PT). With the Panthor and the MCU we then have a
FLUSH_CACHE2 instruction that can be part of the command stream - so yes
you can trigger (some forms of) a cache flush during the middle of a
command stream without CPU intervention.

Thanks,
Steve

>>
>> Also "caches known to be empty" is a dangerous thing to assume on
>> anything that could involve speculation - AFAIK Mali doesn't really
>> perform any form of speculation, but I'm not 100% sure on that.
>> Certainly with CPUs you don't get such a luxury of knowing what it might
>> have populated in the caches.
>>
>> Thanks,
>> Steve
> 
> 


  reply	other threads:[~2026-10-07 13:21 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-29  3:44 [PATCH v12 00/15] Collection of fixes for Panfrost: Perfcnt, RPM, refactorings Adrián Larumbe
2026-09-29  3:44 ` [PATCH v12 01/15] drm/panfrost: Move shrinker initialization and unplug one level down Adrián Larumbe
2026-10-02 13:58   ` Steven Price
2026-09-29  3:44 ` [PATCH v12 02/15] drm/panfrost: Move lock and modparam initialisations into their subsystems Adrián Larumbe
2026-10-02 14:06   ` Steven Price
2026-09-29  3:44 ` [PATCH v12 03/15] drm/panfrost: Move debugfs initialisation to relevant subsystems Adrián Larumbe
2026-10-02 14:10   ` Steven Price
2026-10-06  0:50     ` Adrián Larumbe
2026-09-29  3:44 ` [PATCH v12 04/15] drm/panfrost: Skip NULL checks for clock enable/disabling Adrián Larumbe
2026-10-02 14:14   ` Steven Price
2026-09-29  3:44 ` [PATCH v12 05/15] drm/panfrost: Consolidate device clock management and reset Adrián Larumbe
2026-09-29  3:56   ` sashiko-bot
2026-10-02 14:20   ` Steven Price
2026-09-29  3:44 ` [PATCH v12 06/15] drm/panfrost: Fix PM refcnt and autosuspend issues at device probe/remove Adrián Larumbe
2026-10-02 14:21   ` Steven Price
2026-09-29  3:44 ` [PATCH v12 07/15] drm/panfrost: Explicitly enable MMU interrupts at device init Adrián Larumbe
2026-10-02 14:26   ` Steven Price
2026-09-29  3:44 ` [PATCH v12 08/15] drm/panfrost: Move all DRM device initialisation into device_init() Adrián Larumbe
2026-10-02 14:37   ` Steven Price
2026-09-29  3:44 ` [PATCH v12 09/15] drm/panfrost: Add warning messages to fatal error conditions Adrián Larumbe
2026-10-02 14:59   ` Steven Price
2026-10-06 15:09     ` Adrián Larumbe
2026-10-07 12:51       ` Steven Price
2026-09-29  3:44 ` [PATCH v12 10/15] drm/panfrost: Add debugfs knob for manually triggering a GPU reset Adrián Larumbe
2026-10-02 15:10   ` Steven Price
2026-10-06 13:38     ` Adrián Larumbe
2026-10-07 12:54       ` Steven Price
2026-09-29  3:44 ` [PATCH v12 11/15] drm/panfrost: Move perfcnt GPU disable sequence into a helper Adrián Larumbe
2026-09-29  3:54   ` sashiko-bot
2026-09-29  3:44 ` [PATCH v12 12/15] drm/panfrost: Skip cache flush/invalidate when enabling perfcnt Adrián Larumbe
2026-10-02 15:14   ` Steven Price
2026-10-05  8:38     ` Boris Brezillon
2026-10-05 15:06       ` Steven Price
2026-10-05 15:37         ` Boris Brezillon
2026-10-05 16:05           ` Steven Price
2026-10-05 16:57             ` Boris Brezillon
2026-10-06 17:42               ` Adrián Larumbe
2026-10-06 17:35             ` Adrián Larumbe
2026-10-07 13:28               ` Steven Price
2026-10-06 17:18         ` Adrián Larumbe
2026-10-07 13:21           ` Steven Price [this message]
2026-10-06 16:45     ` Adrián Larumbe
2026-10-07 13:09       ` Steven Price
2026-09-29  3:44 ` [PATCH v12 13/15] drm/panfrost: Avoid cache flush after perfcnt sample in fully coherent systems Adrián Larumbe
2026-10-02 15:28   ` Steven Price
2026-09-29  3:44 ` [PATCH v12 14/15] drm/panfrost: Introduce a reset lock Adrián Larumbe
2026-10-02 15:34   ` Steven Price
2026-09-29  3:44 ` [PATCH v12 15/15] drm/panfrost: Fix races between perfcnt and reset sequence Adrián Larumbe
2026-09-29  4:00   ` sashiko-bot
2026-10-02 15:44   ` Steven Price
2026-10-06 14:14     ` Adrián Larumbe

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=c7a8c70e-9130-45dd-83dd-e7a3c591f68a@arm.com \
    --to=steven.price@arm.com \
    --cc=adrian.larumbe@collabora.com \
    --cc=airlied@gmail.com \
    --cc=boris.brezillon@collabora.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=eric@anholt.net \
    --cc=faith.ekstrand@collabora.com \
    --cc=hanetzer@startmail.com \
    --cc=kernel@collabora.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maarten.lankhorst@linux.intel.com \
    --cc=mripard@kernel.org \
    --cc=neil.armstrong@linaro.org \
    --cc=p.zabel@pengutronix.de \
    --cc=robh@kernel.org \
    --cc=robin.murphy@arm.com \
    --cc=simona@ffwll.ch \
    --cc=tomeu@tomeuvizoso.net \
    --cc=tzimmermann@suse.de \
    /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.