Re: [PATCH v7 13/17] drm/panfrost: Skip cache flush/invalidate when enabling perfcnt

From: Boris Brezillon

Date: Tue Sep 01 2026 - 09:38:24 EST


On Fri, 28 Aug 2026 21:56:53 +0100
Adrián Larumbe <adrian.larumbe@xxxxxxxxxxxxx> wrote:

> The GPU cache flush/invalidate operation is unnecessary, because at present
> all counters are always enabled for all sessions, and there are no plans to
> expand the uAPI so as to let UM select specific counter groups.
>
> If the above was ever implemented, then different counter groups being
> selected between sessions might leave stale data in the GPU caches, so
> the flush/invalidate would have to be reintroduced.

This explanation confuses me. To me, the reason we don't need a
cache-flush has nothing to do with the fact we always enable all
counters, it's just that, either the perfcnt buffer has been freshly
allocated/mapped and the cache has no entry pointing to it, or it's
been written already, and the flush should have happened after the
dump. For the case where the enable happens after a RESET (which you
introduce in one of the remaining commits, I guess), there's no flush
needed either, because the RESET clears all the caches.

>
> Signed-off-by: Adrián Larumbe <adrian.larumbe@xxxxxxxxxxxxx>
> ---
> drivers/gpu/drm/panfrost/panfrost_perfcnt.c | 15 ++-------------
> 1 file changed, 2 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/gpu/drm/panfrost/panfrost_perfcnt.c b/drivers/gpu/drm/panfrost/panfrost_perfcnt.c
> index f71534e741b6..ffc77121070e 100644
> --- a/drivers/gpu/drm/panfrost/panfrost_perfcnt.c
> +++ b/drivers/gpu/drm/panfrost/panfrost_perfcnt.c
> @@ -124,21 +124,10 @@ static int panfrost_perfcnt_enable_locked(struct panfrost_device *pfdev,
> panfrost_gem_internal_set_label(&bo->base, "Perfcnt sample buffer");
>
> /*
> - * Invalidate the cache and clear the counters to start from a fresh
> - * state.
> + * Clear the counters to start from a fresh state.
> */
> - reinit_completion(&pfdev->perfcnt->dump_comp);
> - gpu_write(pfdev, GPU_INT_CLEAR,
> - GPU_IRQ_CLEAN_CACHES_COMPLETED |
> - GPU_IRQ_PERFCNT_SAMPLE_COMPLETED);
> + gpu_write(pfdev, GPU_INT_CLEAR, GPU_IRQ_PERFCNT_SAMPLE_COMPLETED);
> gpu_write(pfdev, GPU_CMD, GPU_CMD_PERFCNT_CLEAR);
> - gpu_write(pfdev, GPU_CMD, GPU_CMD_CLEAN_INV_CACHES);
> - ret = wait_for_completion_timeout(&pfdev->perfcnt->dump_comp,
> - msecs_to_jiffies(1000));
> - if (!ret) {
> - ret = -ETIMEDOUT;
> - goto err_vunmap;
> - }
>
> ret = panfrost_mmu_as_get(pfdev, perfcnt->mapping->mmu);
> if (ret < 0)
>