From e60114b2ae117b0f9cc55de57ab397804c8d6bf8 Mon Sep 17 00:00:00 2001 From: Rafael Antognolli Date: Thu, 6 Jun 2019 10:37:02 -0700 Subject: [PATCH] iris/bufmgr: Query memory region info. v2 (Jason Ekstrand): - Don't leak meminfo if the ioctl fails on the second pass Reviewed-by: Jason Ekstrand Part-of: --- src/gallium/drivers/iris/iris_bufmgr.c | 59 ++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/src/gallium/drivers/iris/iris_bufmgr.c b/src/gallium/drivers/iris/iris_bufmgr.c index c71ef24e4e6..889000c8d64 100644 --- a/src/gallium/drivers/iris/iris_bufmgr.c +++ b/src/gallium/drivers/iris/iris_bufmgr.c @@ -158,6 +158,11 @@ struct bo_export { struct list_head link; }; +struct iris_memregion { + struct drm_i915_gem_memory_class_instance region; + uint64_t size; +}; + struct iris_bufmgr { /** * List into the list of bufmgr. @@ -187,6 +192,7 @@ struct iris_bufmgr { struct util_vma_heap vma_allocator[IRIS_MEMZONE_COUNT]; uint64_t vma_min_align; + struct iris_memregion vram, sys; bool has_llc:1; bool has_mmap_offset:1; @@ -1578,6 +1584,58 @@ gem_param(int fd, int name) return v; } +static void +iris_bufmgr_update_meminfo(struct iris_bufmgr *bufmgr, + const struct drm_i915_query_memory_regions *meminfo) +{ + for (int i = 0; i < meminfo->num_regions; i++) { + const struct drm_i915_memory_region_info *mem = &meminfo->regions[i]; + switch (mem->region.memory_class) { + case I915_MEMORY_CLASS_SYSTEM: + bufmgr->sys.region = mem->region; + bufmgr->sys.size = mem->probed_size; + break; + case I915_MEMORY_CLASS_DEVICE: + bufmgr->vram.region = mem->region; + bufmgr->vram.size = mem->probed_size; + break; + default: + break; + } + }; +} + +static bool +iris_bufmgr_query_meminfo(struct iris_bufmgr *bufmgr) +{ + struct drm_i915_query_item item = { + .query_id = DRM_I915_QUERY_MEMORY_REGIONS, + }; + + struct drm_i915_query query = { + .num_items = 1, + .items_ptr = (uintptr_t) &item, + }; + + if (drmIoctl(bufmgr->fd, DRM_IOCTL_I915_QUERY, &query)) + return false; + + struct drm_i915_query_memory_regions *meminfo = calloc(1, item.length); + item.data_ptr = (uintptr_t)meminfo; + + if (drmIoctl(bufmgr->fd, DRM_IOCTL_I915_QUERY, &query) || + item.length <= 0) { + free(meminfo); + return false; + } + + iris_bufmgr_update_meminfo(bufmgr, meminfo); + + free(meminfo); + + return true; +} + /** * Initializes the GEM buffer manager, which uses the kernel to allocate, map, * and manage map buffer objections. @@ -1620,6 +1678,7 @@ iris_bufmgr_create(struct intel_device_info *devinfo, int fd, bool bo_reuse) bufmgr->has_tiling_uapi = devinfo->has_tiling_uapi; bufmgr->bo_reuse = bo_reuse; bufmgr->has_mmap_offset = gem_param(fd, I915_PARAM_MMAP_GTT_VERSION) >= 4; + iris_bufmgr_query_meminfo(bufmgr); STATIC_ASSERT(IRIS_MEMZONE_SHADER_START == 0ull); const uint64_t _4GB = 1ull << 32;