[PATCH i-g-t] lib/xe: Fix allocation for vram_size and visible_vram_size based on max_gt
Gustavo Sousa
gustavo.sousa at intel.com
Fri Jul 11 13:45:35 UTC 2025
Quoting Kamil Konieczny (2025-07-11 10:26:26-03:00)
>Hi Gustavo,
>On 2025-07-10 at 19:12:27 -0300, Gustavo Sousa wrote:
>> The current allocation for vram_size and visible_vram_size has two
>> issues:
>>
>> * The expression (max_gt = ffsll(xe_dev->gt_mask) - 1) gives us the
>> zero-based index of the first bit set in the mask, which does not give
>> us the maximum GT ID, but the minimum.
>>
>> * Since max_gt is zero-based, even if its value was right, we would
>> still be allocating not enough entries for the array.
>>
>> Fix that by calculating max_gt in the same way that xe_dev_max_gt() does
>> and using (max_gt + 1) as argument to calloc().
>>
>> Cc: Matt Roper <matthew.d.roper at intel.com>
>> Cc: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
>> Fixes: 3a39a6e51b18 ("lib/xe: Populate vram_size[] and visible_vram_size[] by GT ID")
>> Signed-off-by: Gustavo Sousa <gustavo.sousa at intel.com>
>> ---
>> lib/xe/xe_query.c | 6 +++---
>> 1 file changed, 3 insertions(+), 3 deletions(-)
>>
>> diff --git a/lib/xe/xe_query.c b/lib/xe/xe_query.c
>> index 3d628cb3fe59ddc390684941452ca04fd735b212..c0dba018244e8a47c8f1b305cf43ec3d4ffdc575 100644
>> --- a/lib/xe/xe_query.c
>> +++ b/lib/xe/xe_query.c
>> @@ -361,9 +361,9 @@ struct xe_device *xe_device_get(int fd)
>> * vram_size[] and visible_vram_size[] are indexed by uapi ID; ensure
>> * the allocation is large enough to hold the highest GT ID
>> */
>> - max_gt = ffsll(xe_dev->gt_mask) - 1;
>> - xe_dev->vram_size = calloc(max_gt, sizeof(*xe_dev->vram_size));
>> - xe_dev->visible_vram_size = calloc(max_gt, sizeof(*xe_dev->visible_vram_size));
>> + max_gt = igt_fls(xe_dev->gt_mask) - 1;
>> + xe_dev->vram_size = calloc(max_gt + 1, sizeof(*xe_dev->vram_size));
>> + xe_dev->visible_vram_size = calloc(max_gt + 1, sizeof(*xe_dev->visible_vram_size));
>
>It could also just use value from below for loop?
>For example:
> max_gt = xe_dev->gt_list->num_gt - 1;
The value in xe_dev->gt_list->num_gt reflects the number of GTs that
returned from the query, so xe_dev->gt_list->num_gt - 1 will not
necessarily be the maximum GT ID, as now we do not assume that GT IDs
retuned from the query UAPI are consecutive anymore.
--
Gustavo Sousa
>
>If yes this could be someting for future change.
>
>Reviewed-by: Kamil Konieczny <kamil.konieczny at linux.intel.com>
>
>>
>> for (int idx = 0; idx < xe_dev->gt_list->num_gt; idx++) {
>> struct drm_xe_gt *gt = &xe_dev->gt_list->gt_list[idx];
>>
>> ---
>> base-commit: eacde5c2acc37c1570e27b68b8b6c39d8b61fb32
>> change-id: 20250710-fix-allocation-of-vram_size-and-visible_vram_size-f194f0e55610
>>
>> Best regards,
>> --
>> Gustavo Sousa <gustavo.sousa at intel.com>
>>
More information about the igt-dev
mailing list