Re: [PATCH v7 13/17] drm/panfrost: Skip cache flush/invalidate when enabling perfcnt
From: Adrián Larumbe
Date: Wed Sep 02 2026 - 11:59:57 EST
On 01.09.2026 15:32, Boris Brezillon wrote:
> 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.
This is something I wrote after a chat with Steven about whether removing this flush/invalidate was fine.
If memory serves me right, he expressed his concern that flushing GPU caches after a sample might write
disabled counter data into system memory, but in that case UM should know better, and I guess reading off
disabled counter data is seen as undefined behaviour in the TRM.
> >
> > 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)
> >
Adrian Larumbe