1 From 88c6429e4babcb00eb4d324089e4a6916d0a62aa Mon Sep 17 00:00:00 2001
2 From: Robert Beckett <bob.beckett@collabora.com>
3 Date: Wed, 26 Apr 2023 13:28:40 +0100
4 Subject: [PATCH] panfrost: fix scanout buffer alloc
6 Use ro->bo_map to alloc scanout.
7 This fixes leaking the scanout.
9 Fixes: ad4d7ca83324 ("kmsro: Fix renderonly_scanout BO aliasing")
10 Signed-off-by: Robert Beckett <bob.beckett@collabora.com>
13 .../winsys/panfrost/drm/panfrost_drm_winsys.c | 25 +++++++++++--------
14 1 file changed, 14 insertions(+), 11 deletions(-)
16 diff --git a/src/gallium/winsys/panfrost/drm/panfrost_drm_winsys.c b/src/gallium/winsys/panfrost/drm/panfrost_drm_winsys.c
17 index b5ec50d49ef0e..2710217a5b44e 100644
18 --- a/src/gallium/winsys/panfrost/drm/panfrost_drm_winsys.c
19 +++ b/src/gallium/winsys/panfrost/drm/panfrost_drm_winsys.c
20 @@ -63,26 +63,32 @@ panfrost_create_kms_dumb_buffer_for_resource(struct pipe_resource *rsc,
22 struct drm_mode_destroy_dumb destroy_dumb = {0};
24 - /* Align width to end up with a buffer that's aligned on 64 bytes. */
26 - struct renderonly_scanout *scanout = CALLOC_STRUCT(renderonly_scanout);
30 /* create dumb buffer at scanout GPU */
31 int err = drmIoctl(ro->kms_fd, DRM_IOCTL_MODE_CREATE_DUMB, &create_dumb);
33 fprintf(stderr, "DRM_IOCTL_MODE_CREATE_DUMB failed: %s\n",
39 if (create_dumb.pitch % 64)
42 + struct renderonly_scanout *scanout;
44 + simple_mtx_lock(&ro->bo_map_lock);
45 + scanout = util_sparse_array_get(&ro->bo_map, create_dumb.handle);
46 + simple_mtx_unlock(&ro->bo_map_lock);
51 scanout->handle = create_dumb.handle;
52 scanout->stride = create_dumb.pitch;
54 + assert(p_atomic_read(&scanout->refcnt) == 0);
55 + p_atomic_set(&scanout->refcnt, 1);
60 @@ -101,12 +107,9 @@ panfrost_create_kms_dumb_buffer_for_resource(struct pipe_resource *rsc,
64 - destroy_dumb.handle = scanout->handle;
65 + destroy_dumb.handle = create_dumb.handle;
66 drmIoctl(ro->kms_fd, DRM_IOCTL_MODE_DESTROY_DUMB, &destroy_dumb);