]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
accel/ivpu: Flush pending jobs of device's workqueues
authorMaciej Falkowski <maciej.falkowski@linux.intel.com>
Tue, 1 Apr 2025 15:57:55 +0000 (17:57 +0200)
committerJacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
Fri, 11 Apr 2025 09:42:55 +0000 (11:42 +0200)
Use flush_work() instead of cancel_work_sync() for driver IRQ
workqueues to guarantee that remaining pending work
will be handled.

This resolves two issues that were encountered where a driver was left
in an incorrect state as the bottom-half was canceled:

1. Cancelling context-abort of a job that is still executing and
   is causing translation faults which is going to cause additional TDRs

2. Cancelling bottom-half of a DCT (duty-cycle throttling) request
   which will cause a device to not be adjusted to an external frequency
   request.

Fixes: bc3e5f48b7ee ("accel/ivpu: Use workqueue for IRQ handling")
Signed-off-by: Maciej Falkowski <maciej.falkowski@linux.intel.com>
Reviewed-by: Lizhi Hou <lizhi.hou@amd.com>
Reviewed-by: Jeff Hugo <jeff.hugo@oss.qualcomm.com>
Signed-off-by: Jacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
Link: https://lore.kernel.org/r/20250401155755.4049156-1-maciej.falkowski@linux.intel.com
drivers/accel/ivpu/ivpu_drv.c

index 4fa73189502e1a9c869d1a272f4ddc0e835f22d8..5e3888ff102212f1d4f18d8503a2c9c4e47a3ff2 100644 (file)
@@ -421,9 +421,9 @@ void ivpu_prepare_for_reset(struct ivpu_device *vdev)
 {
        ivpu_hw_irq_disable(vdev);
        disable_irq(vdev->irq);
-       cancel_work_sync(&vdev->irq_ipc_work);
-       cancel_work_sync(&vdev->irq_dct_work);
-       cancel_work_sync(&vdev->context_abort_work);
+       flush_work(&vdev->irq_ipc_work);
+       flush_work(&vdev->irq_dct_work);
+       flush_work(&vdev->context_abort_work);
        ivpu_ipc_disable(vdev);
        ivpu_mmu_disable(vdev);
 }