Commit 576c930e authored by Boris Brezillon's avatar Boris Brezillon Committed by Steven Price
Browse files

drm/panthor: Flush shmem writes before mapping buffers CPU-uncached



The shmem layer zeroes out the new pages using cached mappings, and if
we don't CPU-flush we might leave dirty cachelines behind, leading to
potential data leaks and/or asynchronous buffer corruption when dirty
cachelines are evicted.

Fixes: 8a1cc075 ("drm/panthor: Add GEM logical block")
Signed-off-by: default avatarBoris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: default avatarSteven Price <steven.price@arm.com>
Reviewed-by: default avatarLiviu Dudau <liviu.dudau@arm.com>
Signed-off-by: default avatarSteven Price <steven.price@arm.com>
Link: https://patch.msgid.link/20251107171214.1186299-1-boris.brezillon@collabora.com
parent eef295a8
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -288,6 +288,23 @@ panthor_gem_create_with_handle(struct drm_file *file,

	panthor_gem_debugfs_set_usage_flags(bo, 0);

	/* If this is a write-combine mapping, we query the sgt to force a CPU
	 * cache flush (dma_map_sgtable() is called when the sgt is created).
	 * This ensures the zero-ing is visible to any uncached mapping created
	 * by vmap/mmap.
	 * FIXME: Ideally this should be done when pages are allocated, not at
	 * BO creation time.
	 */
	if (shmem->map_wc) {
		struct sg_table *sgt;

		sgt = drm_gem_shmem_get_pages_sgt(shmem);
		if (IS_ERR(sgt)) {
			ret = PTR_ERR(sgt);
			goto out_put_gem;
		}
	}

	/*
	 * Allocate an id of idr table where the obj is registered
	 * and handle has the id what user can see.
@@ -296,6 +313,7 @@ panthor_gem_create_with_handle(struct drm_file *file,
	if (!ret)
		*size = bo->base.base.size;

out_put_gem:
	/* drop reference from allocate - handle holds it now. */
	drm_gem_object_put(&shmem->base);