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 <jason@jlekstrand.net> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5599>
This commit is contained in:

committed by
Marge Bot

parent
84069acfd4
commit
e60114b2ae
@@ -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;
|
||||
|
Reference in New Issue
Block a user