[igt-dev] [PATCH v3 40/57] lib/xe: Get current available size and sync with the 'any gt'.
Francois Dugast
francois.dugast at intel.com
Thu Nov 9 15:53:53 UTC 2023
From: Rodrigo Vivi <rodrigo.vivi at intel.com>
First of all, get the current available size, not a cached
value that we are not sure how old it is.
Also, remove the 'gt' selection number to align with all
the other 'any_region' variants.
Then sync all the loops so we guarantee that the region
where we are inspecting the sizes are exactly the same
where we are allocating the BO: 'any first vram region'.
Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>
---
lib/xe/xe_query.c | 44 +++++++++++++++++++-------------------
lib/xe/xe_query.h | 2 +-
tests/intel/xe_evict_ccs.c | 2 +-
3 files changed, 24 insertions(+), 24 deletions(-)
diff --git a/lib/xe/xe_query.c b/lib/xe/xe_query.c
index a1d4aa44c..20d6690f7 100644
--- a/lib/xe/xe_query.c
+++ b/lib/xe/xe_query.c
@@ -598,37 +598,37 @@ uint64_t xe_visible_vram_size_any_region(int fd)
}
/**
- * xe_vram_available:
+ * xe_vram_available_any_region:
* @fd: xe device fd
- * @gt: gt
*
- * Returns available vram of xe device @fd and @gt.
+ * Returns available vram of any first available region of this device.
+ * It can be used in conjunction with visible_size functions of any
+ * region since the 'any region' selection will end up in the same
+ * region.
*/
-uint64_t xe_vram_available(int fd, int gt)
+uint64_t xe_vram_available_any_region(int fd)
{
- struct xe_device *xe_dev;
- int region_idx;
- struct drm_xe_query_mem_region *mem_region;
struct drm_xe_query_mem_regions *mem_regions;
+ struct drm_xe_device_query query = {
+ .extensions = 0,
+ .query = DRM_XE_DEVICE_QUERY_MEM_REGIONS,
+ .size = 0,
+ .data = 0,
+ };
- xe_dev = find_in_cache(fd);
- igt_assert(xe_dev);
-
- region_idx = ffs(mem_region_near_gt(xe_dev->gt_list, gt)) - 1;
- mem_region = &xe_dev->mem_regions->regions[region_idx];
+ igt_assert_eq(igt_ioctl(fd, DRM_IOCTL_XE_DEVICE_QUERY, &query), 0);
+ igt_assert_neq(query.size, 0);
- if (XE_IS_CLASS_VRAM(mem_region)) {
- uint64_t available_vram;
+ mem_regions = malloc(query.size);
+ igt_assert(mem_regions);
- mem_regions = xe_query_mem_regions_new(fd);
- pthread_mutex_lock(&cache.cache_mutex);
- mem_region->used = mem_regions->regions[region_idx].used;
- available_vram = mem_region->total_size - mem_region->used;
- pthread_mutex_unlock(&cache.cache_mutex);
- free(mem_regions);
+ query.data = to_user_pointer(mem_regions);
+ igt_assert_eq(igt_ioctl(fd, DRM_IOCTL_XE_DEVICE_QUERY, &query), 0);
- return available_vram;
- }
+ for (int i = 0; i < mem_regions->num_regions; i++)
+ if (XE_IS_CLASS_VRAM(&mem_regions->regions[i]))
+ return mem_regions->regions[i].total_size -
+ mem_regions->regions[i].used;
return 0;
}
diff --git a/lib/xe/xe_query.h b/lib/xe/xe_query.h
index f0a3382f2..bec2a7ed6 100644
--- a/lib/xe/xe_query.h
+++ b/lib/xe/xe_query.h
@@ -89,7 +89,7 @@ bool xe_has_vram(int fd);
uint64_t xe_vram_size_any_region(int fd);
uint64_t xe_vram_size_region_near_gt(int fd, int gt);
uint64_t xe_visible_vram_size_any_region(int fd);
-uint64_t xe_vram_available(int fd, int gt);
+uint64_t xe_vram_available_any_region(int fd);
uint32_t xe_get_default_alignment(int fd);
uint32_t xe_va_bits(int fd);
uint16_t xe_dev_id(int fd);
diff --git a/tests/intel/xe_evict_ccs.c b/tests/intel/xe_evict_ccs.c
index c72f24181..7ed2bd41d 100644
--- a/tests/intel/xe_evict_ccs.c
+++ b/tests/intel/xe_evict_ccs.c
@@ -326,7 +326,7 @@ static void set_config(int fd, uint32_t flags, const struct param *param,
config->param = param;
config->flags = flags;
config->free_mb = xe_visible_vram_size_any_region(fd) / SZ_1M;
- config->total_mb = xe_vram_available(fd, 0) / SZ_1M;
+ config->total_mb = xe_vram_available_any_region(fd) / SZ_1M;
config->test_mb = min_t(int, config->free_mb * config->param->vram_percent / 100,
config->total_mb * config->param->vram_percent / 100);
--
2.34.1
More information about the igt-dev
mailing list