On Thu, 24 Oct 2024 15:54:32 +0100
Akash Goel <[email protected]> wrote:

> All CPU mappings are forced as uncached for Panthor buffer objects when
> system(IO) coherency is disabled. Physical backing for Panthor BOs is
> allocated by shmem, which clears the pages also after allocation. But
> there is no explicit cache flush done after the clearing of pages.
> So it could happen that there are dirty cachelines in the CPU cache
> for the BOs, when they are accessed from the CPU side through uncached
> CPU mapping, and the eviction of cachelines overwrites the data of BOs.

Hm, this looks like something that should be handled at the
drm_gem_shmem level when drm_gem_shmem_object::map_wc=true, as I
suspect other drivers can hit the same issue (I'm thinking of panfrost
and lima, but there might be others).

> 
> This commit tries to avoid the potential overwrite scenario.
> 
> Signed-off-by: Akash Goel <[email protected]>
> ---
>  drivers/gpu/drm/panthor/panthor_gem.h | 10 ++++++++++
>  drivers/gpu/drm/panthor/panthor_mmu.c |  5 +++++
>  2 files changed, 15 insertions(+)
> 
> diff --git a/drivers/gpu/drm/panthor/panthor_gem.h 
> b/drivers/gpu/drm/panthor/panthor_gem.h
> index e43021cf6d45..4b0f43f1edf1 100644
> --- a/drivers/gpu/drm/panthor/panthor_gem.h
> +++ b/drivers/gpu/drm/panthor/panthor_gem.h
> @@ -46,6 +46,16 @@ struct panthor_gem_object {
>  
>       /** @flags: Combination of drm_panthor_bo_flags flags. */
>       u32 flags;
> +
> +     /**
> +      * @cleaned: The buffer object pages have been cleaned.
> +      *
> +      * There could be dirty CPU cachelines for the pages of buffer object
> +      * after allocation, as shmem will zero out the pages. The cachelines
> +      * need to be cleaned if the pages are going to be accessed with an
> +      * uncached CPU mapping.
> +      */
> +     bool cleaned;
>  };
>  
>  /**
> diff --git a/drivers/gpu/drm/panthor/panthor_mmu.c 
> b/drivers/gpu/drm/panthor/panthor_mmu.c
> index f522a116c1b1..d8cc9e7d064e 100644
> --- a/drivers/gpu/drm/panthor/panthor_mmu.c
> +++ b/drivers/gpu/drm/panthor/panthor_mmu.c
> @@ -1249,6 +1249,11 @@ static int panthor_vm_prepare_map_op_ctx(struct 
> panthor_vm_op_ctx *op_ctx,
>  
>       op_ctx->map.sgt = sgt;
>  
> +     if (bo->base.map_wc && !bo->cleaned) {
> +             dma_sync_sgtable_for_device(vm->ptdev->base.dev, sgt, 
> DMA_TO_DEVICE);
> +             bo->cleaned = true;
> +     }
> +
>       preallocated_vm_bo = drm_gpuvm_bo_create(&vm->base, &bo->base.base);
>       if (!preallocated_vm_bo) {
>               if (!bo->base.base.import_attach)

Reply via email to