From c8c8c5a3cf34d54423c91ab95d949e7315aabe35 Mon Sep 17 00:00:00 2001 From: Dmitry Baryshkov Date: Sun, 19 Nov 2023 14:36:28 +0200 Subject: [PATCH] freedreno/drm: don't crash in heap allocator when run under valgrind If Mesa is executed under valgrind, fd_bo_init_common() calls fd_bo_map() internally. For the heap (sub-block) allocator this causes a segfault in fd_bo_map(), when this function tries to call the offset() callback. To prevent this from happening, preallocate fb->map before calling into fd_bo_init_common(), stop calling VG_BO_ALLOC() if the memory map is already initialised and disable the VG_BO_FREE call for the heap allocator. Signed-off-by: Dmitry Baryshkov Part-of: --- src/freedreno/drm/freedreno_bo.c | 3 ++- src/freedreno/drm/freedreno_bo_heap.c | 11 +++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/freedreno/drm/freedreno_bo.c b/src/freedreno/drm/freedreno_bo.c index 33780d824b9..6b90c1e6dfe 100644 --- a/src/freedreno/drm/freedreno_bo.c +++ b/src/freedreno/drm/freedreno_bo.c @@ -105,7 +105,8 @@ fd_bo_init_common(struct fd_bo *bo, struct fd_device *dev) bo->max_fences = 1; bo->fences = &bo->_inline_fence; - VG_BO_ALLOC(bo); + if (!bo->map) + VG_BO_ALLOC(bo); } /* allocate a new buffer object, call w/ table_lock held */ diff --git a/src/freedreno/drm/freedreno_bo_heap.c b/src/freedreno/drm/freedreno_bo_heap.c index 64c498255e6..4782218726f 100644 --- a/src/freedreno/drm/freedreno_bo_heap.c +++ b/src/freedreno/drm/freedreno_bo_heap.c @@ -123,7 +123,10 @@ sa_release(struct fd_bo *bo) simple_mtx_assert_locked(&s->heap->lock); - VG_BO_FREE(bo); + /* + * We don't track heap allocs in valgrind + * VG_BO_FREE(bo); + */ fd_bo_fini_fences(bo); @@ -258,12 +261,12 @@ fd_bo_heap_alloc(struct fd_bo_heap *heap, uint32_t size) bo->handle = 1; /* dummy handle to make fd_bo_init_common() happy */ bo->alloc_flags = heap->flags; + /* Pre-initialize mmap ptr, to avoid trying to os_mmap() */ + bo->map = ((uint8_t *)fd_bo_map(heap->blocks[idx])) + block_offset(s); + fd_bo_init_common(bo, heap->dev); bo->handle = FD_BO_SUBALLOC_HANDLE; - /* Pre-initialize mmap ptr, to avoid trying to os_mmap() */ - bo->map = ((uint8_t *)fd_bo_map(heap->blocks[idx])) + block_offset(s); - return bo; }