diff --git a/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau_mem.c b/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau_mem.c index aee1d838325..818bfef9eee 100644 --- a/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau_mem.c +++ b/src/nouveau/vulkan/nvkmd/nouveau/nvkmd_nouveau_mem.c @@ -208,29 +208,28 @@ nvkmd_nouveau_mem_map(struct nvkmd_mem *_mem, } static void -nvkmd_nouveau_mem_unmap(struct nvkmd_mem *_mem) +nvkmd_nouveau_mem_unmap(struct nvkmd_mem *_mem, void *map) { struct nvkmd_nouveau_mem *mem = nvkmd_nouveau_mem(_mem); - munmap(mem->base.map, mem->base.size_B); - mem->base.map = NULL; + munmap(map, mem->base.size_B); } static VkResult nvkmd_nouveau_mem_overmap(struct nvkmd_mem *_mem, - struct vk_object_base *log_obj) + struct vk_object_base *log_obj, + void *map) { struct nvkmd_nouveau_mem *mem = nvkmd_nouveau_mem(_mem); - void *map = mmap(mem->base.map, mem->base.size_B, PROT_NONE, - MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); - if (map == MAP_FAILED) { + void *new_map = mmap(map, mem->base.size_B, PROT_NONE, + MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); + if (new_map == MAP_FAILED) { return vk_errorf(log_obj, VK_ERROR_MEMORY_MAP_FAILED, "Failed to map over original mapping"); } - assert(map == mem->base.map); - mem->base.map = NULL; + assert(new_map == map); return VK_SUCCESS; } diff --git a/src/nouveau/vulkan/nvkmd/nvkmd.c b/src/nouveau/vulkan/nvkmd/nvkmd.c index fea8070faec..83c7fa6b958 100644 --- a/src/nouveau/vulkan/nvkmd/nvkmd.c +++ b/src/nouveau/vulkan/nvkmd/nvkmd.c @@ -208,7 +208,7 @@ nvkmd_mem_unref(struct nvkmd_mem *mem) return; if (mem->map != NULL) - mem->ops->unmap(mem); + mem->ops->unmap(mem, mem->map); mem->ops->free(mem); } diff --git a/src/nouveau/vulkan/nvkmd/nvkmd.h b/src/nouveau/vulkan/nvkmd/nvkmd.h index dba4139749d..abc4dbb9e34 100644 --- a/src/nouveau/vulkan/nvkmd/nvkmd.h +++ b/src/nouveau/vulkan/nvkmd/nvkmd.h @@ -193,10 +193,11 @@ struct nvkmd_mem_ops { void *fixed_addr, void **map_out); - void (*unmap)(struct nvkmd_mem *mem); + void (*unmap)(struct nvkmd_mem *mem, void *map); VkResult (*overmap)(struct nvkmd_mem *mem, - struct vk_object_base *log_obj); + struct vk_object_base *log_obj, + void *map); VkResult (*export_dma_buf)(struct nvkmd_mem *mem, struct vk_object_base *log_obj, @@ -475,16 +476,17 @@ static inline void nvkmd_mem_unmap(struct nvkmd_mem *mem) { assert(mem->map != NULL); - mem->ops->unmap(mem); - assert(mem->map == NULL); + mem->ops->unmap(mem, mem->map); + mem->map = NULL; } static inline VkResult MUST_CHECK nvkmd_mem_overmap(struct nvkmd_mem *mem, struct vk_object_base *log_obj) { assert(mem->map != NULL); - VkResult result = mem->ops->overmap(mem, log_obj); - assert(mem->map == NULL); + VkResult result = mem->ops->overmap(mem, log_obj, mem->map); + if (result == VK_SUCCESS) + mem->map = NULL; return result; }