drm/xe: Fix fence reservation accouting
authorMatthew Brost <matthew.brost@intel.com>
Mon, 11 Sep 2023 21:10:32 +0000 (14:10 -0700)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Thu, 21 Dec 2023 16:41:07 +0000 (11:41 -0500)
Both execs and the preempt rebind worker can issue rebinds. Rebinds
require a fence, per tile, inserted into dma-resv slots of the VM and
BO (if external). The fence reservation accouting did not take into
account the number of fences required for rebinds, fix this.

v2: Rebase

Reviewed-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Reported-by: Christopher Snowhill <kode54@gmail.com>
Link: https://gitlab.freedesktop.org/drm/xe/kernel/-/issues/518
Signed-off-by: Matthew Brost <matthew.brost@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/xe/xe_exec.c
drivers/gpu/drm/xe/xe_vm.c

index eb7fc3192c222a70163fbd09e4a91a5c05fac513..293960efcd22c08a761c881b3f4ddbba83b5ba68 100644 (file)
@@ -103,7 +103,11 @@ static int xe_exec_begin(struct drm_exec *exec, struct xe_vm *vm)
        if (xe_vm_no_dma_fences(vm))
                return 0;
 
-       err = xe_vm_lock_dma_resv(vm, exec, 1, true);
+       /*
+        * 1 fence for job from exec plus a fence for each tile from a possible
+        * rebind
+        */
+       err = xe_vm_lock_dma_resv(vm, exec, 1 + vm->xe->info.tile_count, true);
        if (err)
                return err;
 
index 4def60249381b9a64191f2fc80b896af812e9560..89f7428f00d79ee31e40c1e20f9903d849747a16 100644 (file)
@@ -519,8 +519,13 @@ static int xe_preempt_work_begin(struct drm_exec *exec, struct xe_vm *vm,
        struct xe_vma *vma;
        int err;
 
+       /*
+        * 1 fence for each preempt fence plus a fence for each tile from a
+        * possible rebind
+        */
        err = drm_exec_prepare_obj(exec, xe_vm_obj(vm),
-                                  vm->preempt.num_exec_queues);
+                                  vm->preempt.num_exec_queues +
+                                  vm->xe->info.tile_count);
        if (err)
                return err;