habanalabs: add support for a long interrupt target value
authorOfir Bitton <obitton@habana.ai>
Thu, 23 Sep 2021 09:02:23 +0000 (12:02 +0300)
committerOded Gabbay <ogabbay@kernel.org>
Mon, 18 Oct 2021 09:05:46 +0000 (12:05 +0300)
In order to avoid user target value wraparound, we modify the
current interface so user will be able to wait for an 8-byte
target value rather than a 4-byte value.

Signed-off-by: Ofir Bitton <obitton@habana.ai>
Reviewed-by: Oded Gabbay <ogabbay@kernel.org>
Signed-off-by: Oded Gabbay <ogabbay@kernel.org>
drivers/misc/habanalabs/common/command_submission.c
include/uapi/misc/habanalabs.h

index a344928..44bab01 100644 (file)
@@ -2739,13 +2739,13 @@ static int hl_cs_wait_ioctl(struct hl_fpriv *hpriv, void *data)
 
 static int _hl_interrupt_wait_ioctl(struct hl_device *hdev, struct hl_ctx *ctx,
                                u32 timeout_us, u64 user_address,
-                               u32 target_value, u16 interrupt_offset,
+                               u64 target_value, u16 interrupt_offset,
                                enum hl_cs_wait_status *status)
 {
        struct hl_user_pending_interrupt *pend;
        struct hl_user_interrupt *interrupt;
        unsigned long timeout, flags;
-       u32 completion_value;
+       u64 completion_value;
        long completion_rc;
        int rc = 0;
 
@@ -2779,7 +2779,7 @@ static int _hl_interrupt_wait_ioctl(struct hl_device *hdev, struct hl_ctx *ctx,
        /* We check for completion value as interrupt could have been received
         * before we added the node to the wait list
         */
-       if (copy_from_user(&completion_value, u64_to_user_ptr(user_address), 4)) {
+       if (copy_from_user(&completion_value, u64_to_user_ptr(user_address), 8)) {
                dev_err(hdev->dev, "Failed to copy completion value from user\n");
                rc = -EFAULT;
                goto remove_pending_user_interrupt;
@@ -2811,7 +2811,7 @@ wait_again:
                reinit_completion(&pend->fence.completion);
                spin_unlock_irqrestore(&interrupt->wait_list_lock, flags);
 
-               if (copy_from_user(&completion_value, u64_to_user_ptr(user_address), 4)) {
+               if (copy_from_user(&completion_value, u64_to_user_ptr(user_address), 8)) {
                        dev_err(hdev->dev, "Failed to copy completion value from user\n");
                        rc = -EFAULT;
 
index ccfcb4d..fe73630 100644 (file)
@@ -897,11 +897,7 @@ struct hl_wait_cs_in {
                         */
                        __u64 addr;
                        /* Target value for completion comparison */
-                       __u32 target;
-                       /* Absolute timeout to wait for interrupt
-                        * in microseconds
-                        */
-                       __u32 interrupt_timeout_us;
+                       __u64 target;
                };
        };
 
@@ -917,7 +913,12 @@ struct hl_wait_cs_in {
 
        /* Multi CS API info- valid entries in multi-CS array */
        __u8 seq_arr_len;
-       __u8 pad[7];
+       __u8 pad[3];
+
+       /* Absolute timeout to wait for an interrupt in microseconds.
+        * Relevant only when HL_WAIT_CS_FLAGS_INTERRUPT is set
+        */
+       __u32 interrupt_timeout_us;
 };
 
 #define HL_WAIT_CS_STATUS_COMPLETED    0