[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(&gt_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