Commit bcfcd084 authored by Ofir Bitton's avatar Ofir Bitton Committed by Oded Gabbay

accel/habanalabs: capture interrupt timestamp in handler

In order for interrupt timestamp to be more accurate we should
capture it during the interrupt handling rather than in threaded
irq context.
Signed-off-by: default avatarOfir Bitton <obitton@habana.ai>
Reviewed-by: default avatarOded Gabbay <ogabbay@kernel.org>
Signed-off-by: default avatarOded Gabbay <ogabbay@kernel.org>
Reviewed-by: default avatarStanislaw Gruszka <stanislaw.gruszka@linux.intel.com>
parent 60122358
...@@ -1107,6 +1107,7 @@ enum hl_user_interrupt_type { ...@@ -1107,6 +1107,7 @@ enum hl_user_interrupt_type {
* @type: user interrupt type * @type: user interrupt type
* @wait_list_head: head to the list of user threads pending on this interrupt * @wait_list_head: head to the list of user threads pending on this interrupt
* @wait_list_lock: protects wait_list_head * @wait_list_lock: protects wait_list_head
* @timestamp: last timestamp taken upon interrupt
* @interrupt_id: msix interrupt id * @interrupt_id: msix interrupt id
*/ */
struct hl_user_interrupt { struct hl_user_interrupt {
...@@ -1114,6 +1115,7 @@ struct hl_user_interrupt { ...@@ -1114,6 +1115,7 @@ struct hl_user_interrupt {
enum hl_user_interrupt_type type; enum hl_user_interrupt_type type;
struct list_head wait_list_head; struct list_head wait_list_head;
spinlock_t wait_list_lock; spinlock_t wait_list_lock;
ktime_t timestamp;
u32 interrupt_id; u32 interrupt_id;
}; };
......
...@@ -280,7 +280,6 @@ static void handle_user_interrupt(struct hl_device *hdev, struct hl_user_interru ...@@ -280,7 +280,6 @@ static void handle_user_interrupt(struct hl_device *hdev, struct hl_user_interru
struct list_head *ts_reg_free_list_head = NULL; struct list_head *ts_reg_free_list_head = NULL;
struct timestamp_reg_work_obj *job; struct timestamp_reg_work_obj *job;
bool reg_node_handle_fail = false; bool reg_node_handle_fail = false;
ktime_t now = ktime_get();
int rc; int rc;
/* For registration nodes: /* For registration nodes:
...@@ -303,13 +302,13 @@ static void handle_user_interrupt(struct hl_device *hdev, struct hl_user_interru ...@@ -303,13 +302,13 @@ static void handle_user_interrupt(struct hl_device *hdev, struct hl_user_interru
if (pend->ts_reg_info.buf) { if (pend->ts_reg_info.buf) {
if (!reg_node_handle_fail) { if (!reg_node_handle_fail) {
rc = handle_registration_node(hdev, pend, rc = handle_registration_node(hdev, pend,
&ts_reg_free_list_head, now); &ts_reg_free_list_head, intr->timestamp);
if (rc) if (rc)
reg_node_handle_fail = true; reg_node_handle_fail = true;
} }
} else { } else {
/* Handle wait target value node */ /* Handle wait target value node */
pend->fence.timestamp = now; pend->fence.timestamp = intr->timestamp;
complete_all(&pend->fence.completion); complete_all(&pend->fence.completion);
} }
} }
...@@ -335,6 +334,10 @@ static void handle_user_interrupt(struct hl_device *hdev, struct hl_user_interru ...@@ -335,6 +334,10 @@ static void handle_user_interrupt(struct hl_device *hdev, struct hl_user_interru
*/ */
irqreturn_t hl_irq_handler_user_interrupt(int irq, void *arg) irqreturn_t hl_irq_handler_user_interrupt(int irq, void *arg)
{ {
struct hl_user_interrupt *user_int = arg;
user_int->timestamp = ktime_get();
return IRQ_WAKE_THREAD; return IRQ_WAKE_THREAD;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment