[PATCH 3/7] drm/xe/gt: Extract emit_job_sync()
Lucas De Marchi
lucas.demarchi at intel.com
Tue Jul 8 00:59:37 UTC 2025
On Fri, Jul 04, 2025 at 11:35:02AM +0100, Tvrtko Ursulin wrote:
>
>On 03/07/2025 23:41, Lucas De Marchi wrote:
>>Both the nop and wa jobs are going through the same boiler plate calls
>>to emit the job with a timeout and handling error for both bb and job.
>>Extract emit_job_sync() so those functions create the bb, handling
>>possible errors and delegate the part about really emitting the job
>>and waiting for its completion.
>>
>>Signed-off-by: Lucas De Marchi <lucas.demarchi at intel.com>
>>---
>> drivers/gpu/drm/xe/xe_gt.c | 59 +++++++++++++++++++---------------------------
>> 1 file changed, 24 insertions(+), 35 deletions(-)
>>
>>diff --git a/drivers/gpu/drm/xe/xe_gt.c b/drivers/gpu/drm/xe/xe_gt.c
>>index a926f560f2e36..67425e37c2187 100644
>>--- a/drivers/gpu/drm/xe/xe_gt.c
>>+++ b/drivers/gpu/drm/xe/xe_gt.c
>>@@ -146,30 +146,23 @@ static void xe_gt_disable_host_l2_vram(struct xe_gt *gt)
>> static void gt_reset_worker(struct work_struct *w);
>>-static int emit_nop_job(struct xe_gt *gt, struct xe_exec_queue *q)
>>+static int emit_job_sync(struct xe_exec_queue *q, struct xe_bb *bb,
>>+ long timeout_jiffies)
>> {
>> struct xe_sched_job *job;
>>- struct xe_bb *bb;
>> struct dma_fence *fence;
>> long timeout;
>>- bb = xe_bb_new(gt, 4, false);
>>- if (IS_ERR(bb))
>>- return PTR_ERR(bb);
>>-
>> job = xe_bb_create_job(q, bb);
>>- if (IS_ERR(job)) {
>>- xe_bb_free(bb, NULL);
>>+ if (IS_ERR(job))
>> return PTR_ERR(job);
>>- }
>> xe_sched_job_arm(job);
>> fence = dma_fence_get(&job->drm.s_fence->finished);
>> xe_sched_job_push(job);
>>- timeout = dma_fence_wait_timeout(fence, false, HZ);
>>+ timeout = dma_fence_wait_timeout(fence, false, timeout_jiffies);
>> dma_fence_put(fence);
>>- xe_bb_free(bb, NULL);
>> if (timeout < 0)
>> return timeout;
>> else if (!timeout)
>>@@ -178,17 +171,28 @@ static int emit_nop_job(struct xe_gt *gt, struct xe_exec_queue *q)
>> return 0;
>> }
>>+static int emit_nop_job(struct xe_gt *gt, struct xe_exec_queue *q)
>>+{
>>+ struct xe_bb *bb;
>>+ int ret;
>>+
>>+ bb = xe_bb_new(gt, 4, false);
>>+ if (IS_ERR(bb))
>>+ return PTR_ERR(bb);
>>+
>>+ ret = emit_job_sync(q, bb, HZ);
>>+ xe_bb_free(bb, NULL);
>>+
>>+ return ret;
>>+}
>>+
>> static int emit_wa_job(struct xe_gt *gt, struct xe_exec_queue *q)
>> {
>> struct xe_reg_sr *sr = &q->hwe->reg_lrc;
>> struct xe_reg_sr_entry *entry;
>>+ int count_rmw = 0, count = 0, ret;
>
>Nit - might as well width sort the declarations while touching. Up to you.
it's for very few chars, and would separate the related
xe_reg_sr{,_entry} variables.... so in this case I'd rather leave it
like that.
>
>> unsigned long idx;
>>- struct xe_sched_job *job;
>> struct xe_bb *bb;
>>- struct dma_fence *fence;
>>- long timeout;
>>- int count_rmw = 0;
>>- int count = 0;
>> size_t bb_len;
>> /* count RMW registers as those will be handled separately */
>>@@ -199,9 +203,6 @@ static int emit_wa_job(struct xe_gt *gt, struct xe_exec_queue *q)
>> ++count_rmw;
>> }
>>- if (count || count_rmw)
>>- xe_gt_dbg(gt, "LRC WA %s save-restore batch\n", sr->name);
>>-
>> bb_len = count * 2;
>> if (count_rmw)
>> bb_len += count_rmw * 20 + 7;
>>@@ -292,25 +293,13 @@ static int emit_wa_job(struct xe_gt *gt, struct xe_exec_queue *q)
>> xe_lrc_emit_hwe_state_instructions(q, bb);
>>- job = xe_bb_create_job(q, bb);
>>- if (IS_ERR(job)) {
>>- xe_bb_free(bb, NULL);
>>- return PTR_ERR(job);
>>- }
>>+ if (bb->len)
>>+ xe_gt_dbg(gt, "LRC WA %s save-restore batch: %u dw", sr->name, bb->len);
>>- xe_sched_job_arm(job);
>>- fence = dma_fence_get(&job->drm.s_fence->finished);
>>- xe_sched_job_push(job);
>>-
>>- timeout = dma_fence_wait_timeout(fence, false, HZ);
>>- dma_fence_put(fence);
>>+ ret = emit_job_sync(q, bb, HZ);
>> xe_bb_free(bb, NULL);
>>- if (timeout < 0)
>>- return timeout;
>>- else if (!timeout)
>>- return -ETIME;
>>- return 0;
>>+ return ret;
>> }
>> int xe_gt_record_default_lrcs(struct xe_gt *gt)
>>
>
>Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at igalia.com>
thanks
Lucas De Marchi
>
>Regards,
>
>Tvrtko
>
More information about the Intel-xe
mailing list