aboutsummaryrefslogtreecommitdiff
path: root/drivers/misc
diff options
context:
space:
mode:
authorGravatar Tomer Tayar <ttayar@habana.ai> 2022-11-30 12:07:06 +0200
committerGravatar Oded Gabbay <ogabbay@kernel.org> 2023-01-26 10:56:21 +0200
commit086ab54ac00ca8c2614311a8acf9a3b19760eecc (patch)
tree1134e5ad0b8d2e9da6cfad67621d10cc90c68bf6 /drivers/misc
parenthabanalabs: adjacent timestamps should be more accurate (diff)
downloadlinux-086ab54ac00ca8c2614311a8acf9a3b19760eecc.tar.gz
linux-086ab54ac00ca8c2614311a8acf9a3b19760eecc.tar.bz2
linux-086ab54ac00ca8c2614311a8acf9a3b19760eecc.zip
habanalabs: skip device idle check in hpriv_release if in reset
When user context is released and hpriv_release() is called, there is a device idle status check, to understand if user has left the device not idle and then a reset is required. However, if the user process is killed because of device hard reset, the device at this point would always be not idle, because the device engines were already forcefully halted. Modify hpriv_release() to skip the idle check if reset is in progress. Signed-off-by: Tomer Tayar <ttayar@habana.ai> Reviewed-by: Oded Gabbay <ogabbay@kernel.org> Signed-off-by: Oded Gabbay <ogabbay@kernel.org>
Diffstat (limited to 'drivers/misc')
-rw-r--r--drivers/misc/habanalabs/common/device.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/misc/habanalabs/common/device.c b/drivers/misc/habanalabs/common/device.c
index afd9d4d46574..71f958a2e91b 100644
--- a/drivers/misc/habanalabs/common/device.c
+++ b/drivers/misc/habanalabs/common/device.c
@@ -428,8 +428,10 @@ static void hpriv_release(struct kref *ref)
*/
reset_device = hdev->reset_upon_device_release || hdev->reset_info.watchdog_active;
- /* Unless device is reset in any case, check idle status and reset if device is not idle */
- if (!reset_device && hdev->pdev && !hdev->pldm)
+ /* Check the device idle status and reset if not idle.
+ * Skip it if already in reset, or if device is going to be reset in any case.
+ */
+ if (!hdev->reset_info.in_reset && !reset_device && hdev->pdev && !hdev->pldm)
device_is_idle = hdev->asic_funcs->is_device_idle(hdev, idle_mask,
HL_BUSY_ENGINES_MASK_EXT_SIZE, NULL);
if (!device_is_idle) {