[PATCH i-g-t 2/7] lib/xe: Don't assume GT ID matches location in GT query list

Zbigniew Kempczyński zbigniew.kempczynski at intel.com
Wed Jul 2 11:14:19 UTC 2025


On Mon, Jun 30, 2025 at 09:35:32AM -0700, Matt Roper wrote:
> To prevent confusion between GT ID (uapi) and what a GT's index in the
> list returned by the query ioctl, switch some internal functions to take
> a pointer to the drm_xe_gt structure itself.  Also add a helper function
> that can find this structure in the GT query list, given a uapi GT ID.
> Current platforms always have list index == uapi ID, but this is not
> guaranteed to be true for future platforms.
> 
> Signed-off-by: Matt Roper <matthew.d.roper at intel.com>
> ---
>  lib/xe/xe_query.c | 38 ++++++++++++++++++++++++++------------
>  lib/xe/xe_query.h |  1 +
>  lib/xe/xe_util.c  |  7 ++++---
>  3 files changed, 31 insertions(+), 15 deletions(-)
> 
> diff --git a/lib/xe/xe_query.c b/lib/xe/xe_query.c
> index ac7b3110b..ef4034185 100644
> --- a/lib/xe/xe_query.c
> +++ b/lib/xe/xe_query.c
> @@ -185,21 +185,21 @@ static struct drm_xe_query_oa_units *xe_query_oa_units_new(int fd)
>  	return oa_units;
>  }
>  
> -static uint64_t native_region_for_gt(const struct drm_xe_query_gt_list *gt_list, int gt)
> +static uint64_t native_region_for_gt(const struct drm_xe_gt *gt)
>  {
>  	uint64_t region;
>  
> -	igt_assert(gt_list->num_gt > gt);
> -	region = gt_list->gt_list[gt].near_mem_regions;
> +	igt_assert(gt);
> +	region = gt->near_mem_regions;
>  	igt_assert(region);
>  
>  	return region;
>  }
>  
>  static uint64_t gt_vram_size(const struct drm_xe_query_mem_regions *mem_regions,
> -			     const struct drm_xe_query_gt_list *gt_list, int gt)
> +			     const struct drm_xe_gt *gt)
>  {
> -	int region_idx = ffs(native_region_for_gt(gt_list, gt)) - 1;
> +	int region_idx = ffs(native_region_for_gt(gt)) - 1;

I missed this before, but we need ffsll() here.

>  
>  	if (XE_IS_CLASS_VRAM(&mem_regions->mem_regions[region_idx]))
>  		return mem_regions->mem_regions[region_idx].total_size;
> @@ -208,9 +208,9 @@ static uint64_t gt_vram_size(const struct drm_xe_query_mem_regions *mem_regions,
>  }
>  
>  static uint64_t gt_visible_vram_size(const struct drm_xe_query_mem_regions *mem_regions,
> -				     const struct drm_xe_query_gt_list *gt_list, int gt)
> +				     const struct drm_xe_gt *gt)
>  {
> -	int region_idx = ffs(native_region_for_gt(gt_list, gt)) - 1;
> +	int region_idx = ffs(native_region_for_gt(gt)) - 1;

Ditto.

>  
>  	if (XE_IS_CLASS_VRAM(&mem_regions->mem_regions[region_idx]))
>  		return mem_regions->mem_regions[region_idx].cpu_visible_size;
> @@ -359,10 +359,10 @@ struct xe_device *xe_device_get(int fd)
>  	xe_dev->visible_vram_size = calloc(xe_dev->gt_list->num_gt, sizeof(*xe_dev->visible_vram_size));
>  	for (int gt = 0; gt < xe_dev->gt_list->num_gt; gt++) {
>  		xe_dev->vram_size[gt] = gt_vram_size(xe_dev->mem_regions,
> -						     xe_dev->gt_list, gt);
> +						     &xe_dev->gt_list->gt_list[gt]);
>  		xe_dev->visible_vram_size[gt] =
>  			gt_visible_vram_size(xe_dev->mem_regions,
> -					     xe_dev->gt_list, gt);
> +					     &xe_dev->gt_list->gt_list[gt]);
>  	}
>  	xe_dev->default_alignment = __mem_default_alignment(xe_dev->mem_regions);
>  	xe_dev->has_vram = __mem_has_vram(xe_dev->mem_regions);
> @@ -481,6 +481,20 @@ uint64_t system_memory(int fd)
>  	return regions & 0x1;
>  }
>  
> +/*
> + * Given a uapi GT ID, lookup the corresponding drm_xe_gt structure in the
> + * GT list.
> + */
> +const struct drm_xe_gt *drm_xe_get_gt(struct xe_device *xe_dev, int gt_id)
> +{
> +	for (int i = 0; i < xe_dev->gt_list->num_gt; i++)
> +		if (xe_dev->gt_list->gt_list[i].gt_id == gt_id)
> +			return &xe_dev->gt_list->gt_list[i];
> +
> +	return NULL;
> +}
> +
> +
>  /**
>   * vram_memory:
>   * @fd: xe device fd
> @@ -494,9 +508,9 @@ uint64_t vram_memory(int fd, int gt)
>  
>  	xe_dev = find_in_cache(fd);
>  	igt_assert(xe_dev);
> -	igt_assert(gt >= 0 && gt < xe_dev->gt_list->num_gt);
> +	igt_assert(xe_dev->gt_mask & BIT(gt));
>  
> -	return xe_has_vram(fd) ? native_region_for_gt(xe_dev->gt_list, gt) : 0;
> +	return xe_has_vram(fd) ? native_region_for_gt(drm_xe_get_gt(xe_dev, gt)) : 0;
>  }
>  
>  static uint64_t __xe_visible_vram_size(int fd, int gt)
> @@ -716,7 +730,7 @@ static void __available_vram_size_snapshot(int fd, int gt, struct __available_vr
>  	xe_dev = find_in_cache(fd);
>  	igt_assert(xe_dev);
>  
> -	region_idx = ffs(native_region_for_gt(xe_dev->gt_list, gt)) - 1;
> +	region_idx = ffs(native_region_for_gt(drm_xe_get_gt(xe_dev, gt))) - 1;

And here too.

Rest looks good to me, with above fixed:

Reviewed-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>


>  	mem_region = &xe_dev->mem_regions->mem_regions[region_idx];
>  
>  	if (XE_IS_CLASS_VRAM(mem_region)) {
> diff --git a/lib/xe/xe_query.h b/lib/xe/xe_query.h
> index 37b0cf31e..9a2ceb4c8 100644
> --- a/lib/xe/xe_query.h
> +++ b/lib/xe/xe_query.h
> @@ -95,6 +95,7 @@ struct xe_device {
>  unsigned int xe_number_gt(int fd);
>  uint64_t all_memory_regions(int fd);
>  uint64_t system_memory(int fd);
> +const struct drm_xe_gt *drm_xe_get_gt(struct xe_device *xe_dev, int gt_id);
>  uint64_t vram_memory(int fd, int gt);
>  uint64_t vram_if_possible(int fd, int gt);
>  struct drm_xe_engine *xe_engines(int fd);
> diff --git a/lib/xe/xe_util.c b/lib/xe/xe_util.c
> index 06b378ce0..794f2b639 100644
> --- a/lib/xe/xe_util.c
> +++ b/lib/xe/xe_util.c
> @@ -241,12 +241,13 @@ void xe_bind_unbind_async(int xe, uint32_t vm, uint32_t bind_engine,
>  static uint32_t reference_clock(int fd, int gt_id)
>  {
>  	struct xe_device *dev = xe_device_get(fd);
> +	const struct drm_xe_gt *gt;
>  	uint32_t refclock;
>  
> -	igt_assert(dev && dev->gt_list && dev->gt_list->num_gt);
> -	igt_assert(gt_id >= 0 && gt_id <= dev->gt_list->num_gt);
> +	igt_assert(dev && dev->gt_mask & BIT(gt_id));
>  
> -	refclock = dev->gt_list->gt_list[gt_id].reference_clock;
> +	gt = drm_xe_get_gt(dev, gt_id);
> +	refclock = gt->reference_clock;
>  
>  	igt_assert_lt(0, refclock);
>  
> -- 
> 2.49.0
> 


More information about the igt-dev mailing list