habanalabs: simplify wait for interrupt with timestamp flow
authorYuri Nudelman <ynudelman@habana.ai>
Wed, 6 Oct 2021 08:58:02 +0000 (11:58 +0300)
committerOded Gabbay <ogabbay@kernel.org>
Mon, 18 Oct 2021 09:05:47 +0000 (12:05 +0300)
Remove the flag that determines whether to take a timestamp once the
interrupt arrives.
Instead, always take the timestamp once per interrupt.
This is a must for the user-space to measure its graph operations
to evaluate the graph computation time.

Signed-off-by: Yuri Nudelman <ynudelman@habana.ai>
Reviewed-by: Oded Gabbay <ogabbay@kernel.org>
Signed-off-by: Oded Gabbay <ogabbay@kernel.org>
drivers/misc/habanalabs/common/command_submission.c
drivers/misc/habanalabs/common/habanalabs.h
drivers/misc/habanalabs/common/irq.c

index a3358cc3c877c827cb1ccd148aeadface249acf7..f94ac2350a9b94f030a07518125818c8f8bc7e2e 100644 (file)
@@ -2768,7 +2768,7 @@ static int _hl_interrupt_wait_ioctl(struct hl_device *hdev, struct hl_ctx *ctx,
                                u32 timeout_us, u64 user_address,
                                u64 target_value, u16 interrupt_offset,
                                enum hl_cs_wait_status *status,
-                               bool take_timestamp, u64 *timestamp)
+                               u64 *timestamp)
 {
        struct hl_user_pending_interrupt *pend;
        struct hl_user_interrupt *interrupt;
@@ -2792,8 +2792,6 @@ static int _hl_interrupt_wait_ioctl(struct hl_device *hdev, struct hl_ctx *ctx,
 
        hl_fence_init(&pend->fence, ULONG_MAX);
 
-       pend->fence.take_timestamp = take_timestamp;
-
        if (interrupt_offset == HL_COMMON_USER_INTERRUPT_ID)
                interrupt = &hdev->common_user_interrupt;
        else
@@ -2815,9 +2813,11 @@ static int _hl_interrupt_wait_ioctl(struct hl_device *hdev, struct hl_ctx *ctx,
                goto remove_pending_user_interrupt;
        }
 
-       if (completion_value >= target_value)
+       if (completion_value >= target_value) {
                *status = CS_WAIT_STATUS_COMPLETED;
-       else
+               /* There was no interrupt, we assume the completion is now. */
+               pend->fence.timestamp = ktime_get();
+       } else
                *status = CS_WAIT_STATUS_BUSY;
 
        if (!timeout_us || (*status == CS_WAIT_STATUS_COMPLETED))
@@ -2914,7 +2914,6 @@ static int hl_interrupt_wait_ioctl(struct hl_fpriv *hpriv, void *data)
        rc = _hl_interrupt_wait_ioctl(hdev, hpriv->ctx,
                                args->in.interrupt_timeout_us, args->in.addr,
                                args->in.target, interrupt_offset, &status,
-                               args->in.flags & HL_CS_FLAGS_TIMESTAMP,
                                &timestamp);
 
        if (rc) {
index e7b3b121f24da0c90591057f409aece6d2d0e65d..a2002cbf794b57a554918c1c3c0dd326a29353eb 100644 (file)
@@ -615,7 +615,6 @@ struct asic_fixed_properties {
  *                         masters QIDs that multi cs is waiting on
  * @error: mark this fence with error
  * @timestamp: timestamp upon completion
- * @take_timestamp: timestamp shall be taken upon completion
  * @mcs_handling_done: indicates that corresponding command submission has
  *                     finished msc handling, this does not mean it was part
  *                     of the mcs
@@ -627,7 +626,6 @@ struct hl_fence {
        u32                     stream_master_qid_map;
        int                     error;
        ktime_t                 timestamp;
-       u8                      take_timestamp;
        u8                      mcs_handling_done;
 };
 
index 0dd00ffd18094f9cab9fc441ff03771819bcc7f2..96d82b6826745ad9b13908df334ea512c7fd477d 100644 (file)
@@ -141,11 +141,11 @@ static void handle_user_cq(struct hl_device *hdev,
                        struct hl_user_interrupt *user_cq)
 {
        struct hl_user_pending_interrupt *pend;
+       ktime_t now = ktime_get();
 
        spin_lock(&user_cq->wait_list_lock);
        list_for_each_entry(pend, &user_cq->wait_list_head, wait_list_node) {
-               if (pend->fence.take_timestamp)
-                       pend->fence.timestamp = ktime_get();
+               pend->fence.timestamp = now;
                complete_all(&pend->fence.completion);
        }
        spin_unlock(&user_cq->wait_list_lock);