From 75196731370b301c7e7541f68e3a1551d1e50041 Mon Sep 17 00:00:00 2001 From: Jan Palus Date: Thu, 22 Jun 2023 19:16:05 +0200 Subject: up to 23.1.3 - add patch fixing memory leak on mode change when using panfrost driver from: https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23746 diff --git a/Mesa.spec b/Mesa.spec index b719028..3cb7410 100644 --- a/Mesa.spec +++ b/Mesa.spec @@ -73,14 +73,15 @@ Summary: Free OpenGL implementation Summary(pl.UTF-8): Wolnodostępna implementacja standardu OpenGL Name: Mesa -Version: 23.1.2 +Version: 23.1.3 Release: 1 License: MIT (core) and others - see license.html file Group: X11/Libraries #Source0: ftp://ftp.freedesktop.org/pub/mesa/mesa-%{version}.tar.xz ## Source0-md5: 7c61a801311fb8d2f7b3cceb7b5cf308 Source0: https://archive.mesa3d.org/mesa-%{version}.tar.xz -# Source0-md5: 0e9859110df4425e83186e0645452daa +# Source0-md5: 0dce0342dbf08dc5afbaf51e729da1a1 +Patch0: panfrost-mem-leak.patch URL: https://www.mesa3d.org/ %if %{with opencl_spirv} || %{with gallium_rusticl} BuildRequires: SPIRV-LLVM-Translator-devel >= 8.0.1.3 @@ -1441,6 +1442,7 @@ radv - eksperymentalny sterownik Vulkan dla GPU firmy AMD. %prep %setup -q -n mesa-%{version} +%patch0 -p1 %build %if %{with opencl} diff --git a/panfrost-mem-leak.patch b/panfrost-mem-leak.patch new file mode 100644 index 0000000..fe286e2 --- /dev/null +++ b/panfrost-mem-leak.patch @@ -0,0 +1,76 @@ +From 88c6429e4babcb00eb4d324089e4a6916d0a62aa Mon Sep 17 00:00:00 2001 +From: Robert Beckett +Date: Wed, 26 Apr 2023 13:28:40 +0100 +Subject: [PATCH] panfrost: fix scanout buffer alloc + +Use ro->bo_map to alloc scanout. +This fixes leaking the scanout. + +Fixes: ad4d7ca83324 ("kmsro: Fix renderonly_scanout BO aliasing") +Signed-off-by: Robert Beckett +Cc: mesa-stable +--- + .../winsys/panfrost/drm/panfrost_drm_winsys.c | 25 +++++++++++-------- + 1 file changed, 14 insertions(+), 11 deletions(-) + +diff --git a/src/gallium/winsys/panfrost/drm/panfrost_drm_winsys.c b/src/gallium/winsys/panfrost/drm/panfrost_drm_winsys.c +index b5ec50d49ef0e..2710217a5b44e 100644 +--- a/src/gallium/winsys/panfrost/drm/panfrost_drm_winsys.c ++++ b/src/gallium/winsys/panfrost/drm/panfrost_drm_winsys.c +@@ -63,26 +63,32 @@ panfrost_create_kms_dumb_buffer_for_resource(struct pipe_resource *rsc, + }; + struct drm_mode_destroy_dumb destroy_dumb = {0}; + +- /* Align width to end up with a buffer that's aligned on 64 bytes. */ +- +- struct renderonly_scanout *scanout = CALLOC_STRUCT(renderonly_scanout); +- if (!scanout) +- return NULL; +- + /* create dumb buffer at scanout GPU */ + int err = drmIoctl(ro->kms_fd, DRM_IOCTL_MODE_CREATE_DUMB, &create_dumb); + if (err < 0) { + fprintf(stderr, "DRM_IOCTL_MODE_CREATE_DUMB failed: %s\n", + strerror(errno)); +- goto free_scanout; ++ return NULL; + } + + if (create_dumb.pitch % 64) + goto free_dumb; + ++ struct renderonly_scanout *scanout; ++ ++ simple_mtx_lock(&ro->bo_map_lock); ++ scanout = util_sparse_array_get(&ro->bo_map, create_dumb.handle); ++ simple_mtx_unlock(&ro->bo_map_lock); ++ ++ if (!scanout) ++ goto free_dumb; ++ + scanout->handle = create_dumb.handle; + scanout->stride = create_dumb.pitch; + ++ assert(p_atomic_read(&scanout->refcnt) == 0); ++ p_atomic_set(&scanout->refcnt, 1); ++ + if (!out_handle) + return scanout; + +@@ -101,12 +107,9 @@ panfrost_create_kms_dumb_buffer_for_resource(struct pipe_resource *rsc, + return scanout; + + free_dumb: +- destroy_dumb.handle = scanout->handle; ++ destroy_dumb.handle = create_dumb.handle; + drmIoctl(ro->kms_fd, DRM_IOCTL_MODE_DESTROY_DUMB, &destroy_dumb); + +-free_scanout: +- FREE(scanout); +- + return NULL; + } + +-- +GitLab + -- cgit v0.10.2