[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