nvk/nvkmd: Plumb map pointers through to back-end unmap funcs

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31004>
This commit is contained in:
Faith Ekstrand
2024-09-03 11:14:07 -05:00
committed by Marge Bot
parent b130c6dae4
commit 6c782b8a12
3 changed files with 17 additions and 16 deletions

View File

@@ -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;
}

View File

@@ -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);
}

View File

@@ -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;
}