drm/xe/pf: Disable PF restart worker on device removal
authorMichal Wajdeczko <michal.wajdeczko@intel.com>
Fri, 1 Aug 2025 14:28:20 +0000 (16:28 +0200)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Mon, 4 Aug 2025 15:59:01 +0000 (11:59 -0400)
We can't let restart worker run once device is removed, since other
data that it might want to access could be already released.
Explicitly disable worker as part of device cleanup action.

Fixes: a4d1c5d0b99b ("drm/xe/pf: Move VFs reprovisioning to worker")
Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Reviewed-by: Piotr Piórkowski <piotr.piorkowski@intel.com>
Cc: Jonathan Cavitt <jonathan.cavitt@intel.com>
Link: https://lore.kernel.org/r/20250801142822.180530-2-michal.wajdeczko@intel.com
(cherry picked from commit a424353937c24554bb242a6582ed8f018b4a411c)
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/xe/xe_gt_sriov_pf.c

index 35489fa818259de26f4f5570e4af5be3849f4836..2ea81d81c0aeb4d8aff8c090efe016e3ac0e987e 100644 (file)
@@ -47,9 +47,16 @@ static int pf_alloc_metadata(struct xe_gt *gt)
 
 static void pf_init_workers(struct xe_gt *gt)
 {
+       xe_gt_assert(gt, IS_SRIOV_PF(gt_to_xe(gt)));
        INIT_WORK(&gt->sriov.pf.workers.restart, pf_worker_restart_func);
 }
 
+static void pf_fini_workers(struct xe_gt *gt)
+{
+       xe_gt_assert(gt, IS_SRIOV_PF(gt_to_xe(gt)));
+       disable_work_sync(&gt->sriov.pf.workers.restart);
+}
+
 /**
  * xe_gt_sriov_pf_init_early - Prepare SR-IOV PF data structures on PF.
  * @gt: the &xe_gt to initialize
@@ -79,6 +86,21 @@ int xe_gt_sriov_pf_init_early(struct xe_gt *gt)
        return 0;
 }
 
+static void pf_fini_action(void *arg)
+{
+       struct xe_gt *gt = arg;
+
+       pf_fini_workers(gt);
+}
+
+static int pf_init_late(struct xe_gt *gt)
+{
+       struct xe_device *xe = gt_to_xe(gt);
+
+       xe_gt_assert(gt, IS_SRIOV_PF(xe));
+       return devm_add_action_or_reset(xe->drm.dev, pf_fini_action, gt);
+}
+
 /**
  * xe_gt_sriov_pf_init - Prepare SR-IOV PF data structures on PF.
  * @gt: the &xe_gt to initialize
@@ -95,7 +117,15 @@ int xe_gt_sriov_pf_init(struct xe_gt *gt)
        if (err)
                return err;
 
-       return xe_gt_sriov_pf_migration_init(gt);
+       err = xe_gt_sriov_pf_migration_init(gt);
+       if (err)
+               return err;
+
+       err = pf_init_late(gt);
+       if (err)
+               return err;
+
+       return 0;
 }
 
 static bool pf_needs_enable_ggtt_guest_update(struct xe_device *xe)