When other_sob->need_reset is true and encaps_sig is false,
  hw_sob_put(other_sob) decrements the kref to 0, but the matching
  hw_sob_get(other_sob) is skipped because it is inside the encaps_sig
  block. The function returns other_sob with kref=0, causing a subsequent
  kref_put to underflow. Fix by adding hw_sob_get(other_sob) in the else
  branch.

Cc: [email protected]
Fixes: dadf17abb724 ("habanalabs: add support for encapsulated signals 
reservation")
Signed-off-by: WenTao Liang <[email protected]>
---
 drivers/accel/habanalabs/common/command_submission.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/accel/habanalabs/common/command_submission.c 
b/drivers/accel/habanalabs/common/command_submission.c
index ba4257bda77b..675301dfc0ef 100644
--- a/drivers/accel/habanalabs/common/command_submission.c
+++ b/drivers/accel/habanalabs/common/command_submission.c
@@ -1860,11 +1860,10 @@ int hl_cs_signal_sob_wraparound_handler(struct 
hl_device *hdev, u32 q_idx,
                if (other_sob->need_reset)
                        hw_sob_put(other_sob);
 
-               if (encaps_sig) {
+               if (encaps_sig)
                        /* set reset indication for the sob */
                        sob->need_reset = true;
-                       hw_sob_get(other_sob);
-               }
+               hw_sob_get(other_sob);
 
                dev_dbg(hdev->dev, "switched to SOB %d, q_idx: %d\n",
                                prop->curr_sob_offset, q_idx);
-- 
2.39.5 (Apple Git-154)

Reply via email to