]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
accel/ivpu: Prevent recovery work from being queued during device removal
authorKarol Wachowski <karol.wachowski@intel.com>
Fri, 8 Aug 2025 11:09:39 +0000 (13:09 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 9 Sep 2025 16:58:14 +0000 (18:58 +0200)
commit 69a79ada8eb034ce016b5b78fb7d08d8687223de upstream.

Use disable_work_sync() instead of cancel_work_sync() in ivpu_dev_fini()
to ensure that no new recovery work items can be queued after device
removal has started. Previously, recovery work could be scheduled even
after canceling existing work, potentially leading to use-after-free
bugs if recovery accessed freed resources.

Rename ivpu_pm_cancel_recovery() to ivpu_pm_disable_recovery() to better
reflect its new behavior.

Fixes: 58cde80f45a2 ("accel/ivpu: Use dedicated work for job timeout detection")
Cc: stable@vger.kernel.org # v6.8+
Signed-off-by: Karol Wachowski <karol.wachowski@intel.com>
Reviewed-by: Lizhi Hou <lizhi.hou@amd.com>
Signed-off-by: Jacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
Link: https://lore.kernel.org/r/20250808110939.328366-1-jacek.lawrynowicz@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/accel/ivpu/ivpu_drv.c
drivers/accel/ivpu/ivpu_pm.c
drivers/accel/ivpu/ivpu_pm.h

index 00208c4a6580736f2b20978da025a7fe0d8ac367..ea2909c4745ab2f43131abeae14bec2cf1d37d77 100644 (file)
@@ -689,7 +689,7 @@ static void ivpu_bo_unbind_all_user_contexts(struct ivpu_device *vdev)
 static void ivpu_dev_fini(struct ivpu_device *vdev)
 {
        ivpu_jobs_abort_all(vdev);
-       ivpu_pm_cancel_recovery(vdev);
+       ivpu_pm_disable_recovery(vdev);
        ivpu_pm_disable(vdev);
        ivpu_prepare_for_reset(vdev);
        ivpu_shutdown(vdev);
index 2269569bdee7bb3b04d4330de6a7e200c75ddcb3..ad02b71c73bbfa8cc0f79ff09119310941c77d2f 100644 (file)
@@ -382,10 +382,10 @@ void ivpu_pm_init(struct ivpu_device *vdev)
        ivpu_dbg(vdev, PM, "Autosuspend delay = %d\n", delay);
 }
 
-void ivpu_pm_cancel_recovery(struct ivpu_device *vdev)
+void ivpu_pm_disable_recovery(struct ivpu_device *vdev)
 {
        drm_WARN_ON(&vdev->drm, delayed_work_pending(&vdev->pm->job_timeout_work));
-       cancel_work_sync(&vdev->pm->recovery_work);
+       disable_work_sync(&vdev->pm->recovery_work);
 }
 
 void ivpu_pm_enable(struct ivpu_device *vdev)
index b70efe6c36e47fd80638c72e7e95172d22090c75..ba5b9d567e7b4dbe3d2805fc49b9036271f52359 100644 (file)
@@ -25,7 +25,7 @@ struct ivpu_pm_info {
 void ivpu_pm_init(struct ivpu_device *vdev);
 void ivpu_pm_enable(struct ivpu_device *vdev);
 void ivpu_pm_disable(struct ivpu_device *vdev);
-void ivpu_pm_cancel_recovery(struct ivpu_device *vdev);
+void ivpu_pm_disable_recovery(struct ivpu_device *vdev);
 
 int ivpu_pm_suspend_cb(struct device *dev);
 int ivpu_pm_resume_cb(struct device *dev);