drm/xe: Fix dequeue of access counter work item
authorBrian Welty <brian.welty@intel.com>
Tue, 31 Oct 2023 21:12:16 +0000 (14:12 -0700)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Thu, 21 Dec 2023 16:43:33 +0000 (11:43 -0500)
The access counters worker function is fixed to advance the head pointer
when dequeuing from the acc_queue.  This now matches the similar logic in
get_pagefault().

Signed-off-by: Bruce Chang <yu.bruce.chang@intel.com>
Signed-off-by: Brian Welty <brian.welty@intel.com>
Reviewed-by: Stuart Summers <stuart.summers@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/xe/xe_gt_pagefault.c

index 4e33ef8c9d6ac4fcf03d22120f09258e1ea26d26..018edf731ae5e3ece2587edfca59207d573651df 100644 (file)
@@ -542,6 +542,8 @@ unlock_vm:
 
 #define make_u64(hi__, low__)  ((u64)(hi__) << 32 | (u64)(low__))
 
+#define ACC_MSG_LEN_DW        4
+
 static int get_acc(struct acc_queue *acc_queue, struct acc *acc)
 {
        const struct xe_guc_acc_desc *desc;
@@ -562,6 +564,9 @@ static int get_acc(struct acc_queue *acc_queue, struct acc *acc)
                acc->access_type = FIELD_GET(ACC_TYPE, desc->dw0);
                acc->va_range_base = make_u64(desc->dw3 & ACC_VIRTUAL_ADDR_RANGE_HI,
                                              desc->dw2 & ACC_VIRTUAL_ADDR_RANGE_LO);
+
+               acc_queue->head = (acc_queue->head + ACC_MSG_LEN_DW) %
+                                 ACC_QUEUE_NUM_DW;
        } else {
                ret = -1;
        }
@@ -589,8 +594,6 @@ static void acc_queue_work_func(struct work_struct *w)
        }
 }
 
-#define ACC_MSG_LEN_DW 4
-
 static bool acc_queue_full(struct acc_queue *acc_queue)
 {
        lockdep_assert_held(&acc_queue->lock);