[PATCH v2 4/4] drm/xe: Invert access counter queue head / tail
Lucas De Marchi
lucas.demarchi at intel.com
Wed Jan 10 20:34:17 UTC 2024
On Tue, Jan 09, 2024 at 05:24:39PM -0800, Matthew Brost wrote:
>Convention for queues in Linux is the producer moves the head and
>consumer moves the tail. Fix the access counter queue to conform to
>this convention.
>
>Cc: Lucas De Marchi <lucas.demarchi at intel.com>
>Signed-off-by: Matthew Brost <matthew.brost at intel.com>
same comment as in patch #2... I checked the objdump output and with the
extra hunk in xe_gt_pagefault_reset(), they match.
Reviewed-by: Lucas De Marchi <lucas.demarchi at intel.com>
thanks
Lucas De Marchi
>---
> drivers/gpu/drm/xe/xe_gt_pagefault.c | 14 +++++++-------
> drivers/gpu/drm/xe/xe_gt_types.h | 13 +++++++------
> 2 files changed, 14 insertions(+), 13 deletions(-)
>
>diff --git a/drivers/gpu/drm/xe/xe_gt_pagefault.c b/drivers/gpu/drm/xe/xe_gt_pagefault.c
>index 13183088401f..5c2603075af9 100644
>--- a/drivers/gpu/drm/xe/xe_gt_pagefault.c
>+++ b/drivers/gpu/drm/xe/xe_gt_pagefault.c
>@@ -564,9 +564,9 @@ static bool get_acc(struct acc_queue *acc_queue, struct acc *acc)
> bool ret = false;
>
> spin_lock(&acc_queue->lock);
>- if (acc_queue->head != acc_queue->tail) {
>+ if (acc_queue->tail != acc_queue->head) {
> desc = (const struct xe_guc_acc_desc *)
>- (acc_queue->data + acc_queue->head);
>+ (acc_queue->data + acc_queue->tail);
>
> acc->granularity = FIELD_GET(ACC_GRANULARITY, desc->dw2);
> acc->sub_granularity = FIELD_GET(ACC_SUBG_HI, desc->dw1) << 31 |
>@@ -579,7 +579,7 @@ static bool get_acc(struct acc_queue *acc_queue, struct acc *acc)
> 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->tail = (acc_queue->tail + ACC_MSG_LEN_DW) %
> ACC_QUEUE_NUM_DW;
> ret = true;
> }
>@@ -607,7 +607,7 @@ static void acc_queue_work_func(struct work_struct *w)
> }
>
> if (time_after(jiffies, threshold) &&
>- acc_queue->head != acc_queue->tail) {
>+ acc_queue->tail != acc_queue->head) {
> queue_work(gt->usm.acc_wq, w);
> break;
> }
>@@ -618,7 +618,7 @@ static bool acc_queue_full(struct acc_queue *acc_queue)
> {
> lockdep_assert_held(&acc_queue->lock);
>
>- return CIRC_SPACE(acc_queue->tail, acc_queue->head, ACC_QUEUE_NUM_DW) <=
>+ return CIRC_SPACE(acc_queue->head, acc_queue->tail, ACC_QUEUE_NUM_DW) <=
> ACC_MSG_LEN_DW;
> }
>
>@@ -643,9 +643,9 @@ int xe_guc_access_counter_notify_handler(struct xe_guc *guc, u32 *msg, u32 len)
> spin_lock(&acc_queue->lock);
> full = acc_queue_full(acc_queue);
> if (!full) {
>- memcpy(acc_queue->data + acc_queue->tail, msg,
>+ memcpy(acc_queue->data + acc_queue->head, msg,
> len * sizeof(u32));
>- acc_queue->tail = (acc_queue->tail + len) % ACC_QUEUE_NUM_DW;
>+ acc_queue->head = (acc_queue->head + len) % ACC_QUEUE_NUM_DW;
> queue_work(gt->usm.acc_wq, &acc_queue->worker);
> } else {
> drm_warn(>_to_xe(gt)->drm, "ACC Queue full, dropping ACC");
>diff --git a/drivers/gpu/drm/xe/xe_gt_types.h b/drivers/gpu/drm/xe/xe_gt_types.h
>index b15503dabba4..047cde6cda10 100644
>--- a/drivers/gpu/drm/xe/xe_gt_types.h
>+++ b/drivers/gpu/drm/xe/xe_gt_types.h
>@@ -252,15 +252,16 @@ struct xe_gt {
> /** @data: data in the page fault queue */
> u32 data[ACC_QUEUE_NUM_DW];
> /**
>- * @head: head pointer in DWs for page fault queue,
>- * moved by worker which processes faults.
>+ * @tail: tail pointer in DWs for access counter queue,
>+ * moved by worker which processes counters
>+ * (consumer).
> */
>- u16 head;
>+ u16 tail;
> /**
>- * @tail: tail pointer in DWs for page fault queue,
>- * moved by G2H handler.
>+ * @head: head pointer in DWs for access counter queue,
>+ * moved by G2H handler (producer).
> */
>- u16 tail;
>+ u16 head;
> /** @lock: protects page fault queue */
> spinlock_t lock;
> /** @worker: to process access counters */
>--
>2.34.1
>
More information about the Intel-xe
mailing list