]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/xe/memirq: Reduce buffer size
authorMichal Wajdeczko <michal.wajdeczko@intel.com>
Mon, 18 May 2026 19:25:43 +0000 (21:25 +0200)
committerMichal Wajdeczko <michal.wajdeczko@intel.com>
Tue, 19 May 2026 08:50:28 +0000 (10:50 +0200)
When using MSI-X, we don't have to allocate the largest possible
buffer to accommodate all potential engine instances. Loop through
available engines, find highest engine instance and reduce buffer
size to avoid memory waste.

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Ilia Levi <ilia.levi@intel.com>
Reviewed-by: Ilia Levi <ilia.levi@intel.com>
Link: https://patch.msgid.link/20260518192547.600-6-michal.wajdeczko@intel.com
drivers/gpu/drm/xe/xe_memirq.c

index 285fffea62d8d11b751501a59a2a5beb5a098028..92f1c1150d8389c2a97cb96500aed5a7091e10a0 100644 (file)
@@ -172,18 +172,35 @@ static inline bool hw_reports_to_instance_zero(struct xe_memirq *memirq)
        return xe_device_has_msix(memirq_to_xe(memirq));
 }
 
+static unsigned int hwe_max_count(struct xe_tile *tile)
+{
+       unsigned int max_instance = 0;
+       unsigned int gtid, hweid;
+       struct xe_hw_engine *hwe;
+       struct xe_gt *gt;
+
+       for_each_gt_on_tile(gt, tile, gtid)
+               for_each_hw_engine(hwe, gt, hweid)
+                       max_instance = max(max_instance, hwe->instance);
+
+       return max_instance + 1;
+}
+
 static int memirq_alloc_pages(struct xe_memirq *memirq)
 {
        struct xe_device *xe = memirq_to_xe(memirq);
        struct xe_tile *tile = memirq_to_tile(memirq);
-       size_t bo_size = hw_reports_to_instance_zero(memirq) ?
-               XE_HW_ENGINE_MAX_INSTANCE * SZ_4K : SZ_4K;
+       unsigned int num_pages;
        struct xe_bo *bo;
+       size_t bo_size;
        int err;
 
        BUILD_BUG_ON(!IS_ALIGNED(XE_MEMIRQ_SOURCE_OFFSET(0), SZ_64));
        BUILD_BUG_ON(!IS_ALIGNED(XE_MEMIRQ_STATUS_OFFSET(0), SZ_4K));
 
+       num_pages = hw_reports_to_instance_zero(memirq) ? hwe_max_count(tile) : 1;
+       bo_size = num_pages * SZ_4K;
+
        bo = xe_managed_bo_create_pin_map(xe, tile, bo_size,
                                          XE_BO_FLAG_SYSTEM |
                                          XE_BO_FLAG_GGTT |