]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/xe/lrc: Reduce scope of empty lrc data
authorLucas De Marchi <lucas.demarchi@intel.com>
Thu, 10 Jul 2025 20:33:46 +0000 (13:33 -0700)
committerLucas De Marchi <lucas.demarchi@intel.com>
Mon, 14 Jul 2025 20:20:02 +0000 (13:20 -0700)
The only case in which new lrc data is created from scratch is when it's
called prior to recording the default lrc. There's no need to check for
NULL init_data since in that case the function already failed: just move
the allocation where it's needed.

Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com>
Link: https://lore.kernel.org/r/20250710-lrc-refactors-v2-1-a5e2ca03f6bd@intel.com
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
drivers/gpu/drm/xe/xe_lrc.c

index 0769d759b558862e9c907aa6ea30874c57e61ed3..682c5b69fee8c6a3968a6560ec6a3ea2f6626da9 100644 (file)
@@ -1157,7 +1157,6 @@ static int xe_lrc_init(struct xe_lrc *lrc, struct xe_hw_engine *hwe,
        struct xe_tile *tile = gt_to_tile(gt);
        struct xe_device *xe = gt_to_xe(gt);
        struct iosys_map map;
-       void *init_data = NULL;
        u32 arb_enable;
        u32 bo_flags;
        int err;
@@ -1195,25 +1194,26 @@ static int xe_lrc_init(struct xe_lrc *lrc, struct xe_hw_engine *hwe,
        xe_hw_fence_ctx_init(&lrc->fence_ctx, hwe->gt,
                             hwe->fence_irq, hwe->name);
 
-       if (!gt->default_lrc[hwe->class]) {
-               init_data = empty_lrc_data(hwe);
-               if (!init_data) {
-                       err = -ENOMEM;
-                       goto err_lrc_finish;
-               }
-       }
-
        /*
         * Init Per-Process of HW status Page, LRC / context state to known
-        * values
+        * values. If there's already a primed default_lrc, just copy it, otherwise
+        * it's the early submission to record the lrc: build a new empty one from
+        * scratch.
         */
        map = __xe_lrc_pphwsp_map(lrc);
-       if (!init_data) {
+       if (gt->default_lrc[hwe->class]) {
                xe_map_memset(xe, &map, 0, 0, LRC_PPHWSP_SIZE); /* PPHWSP */
                xe_map_memcpy_to(xe, &map, LRC_PPHWSP_SIZE,
                                 gt->default_lrc[hwe->class] + LRC_PPHWSP_SIZE,
                                 lrc_size - LRC_PPHWSP_SIZE);
        } else {
+               void *init_data = empty_lrc_data(hwe);
+
+               if (!init_data) {
+                       err = -ENOMEM;
+                       goto err_lrc_finish;
+               }
+
                xe_map_memcpy_to(xe, &map, 0, init_data, lrc_size);
                kfree(init_data);
        }