static bool check_timeout(struct xe_exec_queue *q, struct xe_sched_job *job)
 {
        struct xe_gt *gt = guc_to_gt(exec_queue_to_guc(q));
-       u32 ctx_timestamp = xe_lrc_ctx_timestamp(q->lrc[0]);
-       u32 ctx_job_timestamp = xe_lrc_ctx_job_timestamp(q->lrc[0]);
+       u32 ctx_timestamp, ctx_job_timestamp;
        u32 timeout_ms = q->sched_props.job_timeout_ms;
        u32 diff;
        u64 running_time_ms;
 
+       if (!xe_sched_job_started(job)) {
+               xe_gt_warn(gt, "Check job timeout: seqno=%u, lrc_seqno=%u, guc_id=%d, not started",
+                          xe_sched_job_seqno(job), xe_sched_job_lrc_seqno(job),
+                          q->guc->id);
+
+               return xe_sched_invalidate_job(job, 2);
+       }
+
+       ctx_timestamp = xe_lrc_ctx_timestamp(q->lrc[0]);
+       ctx_job_timestamp = xe_lrc_ctx_job_timestamp(q->lrc[0]);
+
        /*
         * Counter wraps at ~223s at the usual 19.2MHz, be paranoid catch
         * possible overflows with a high timeout.
                exec_queue_killed_or_banned_or_wedged(q) ||
                exec_queue_destroyed(q);
 
-       /* Job hasn't started, can't be timed out */
-       if (!skip_timeout_check && !xe_sched_job_started(job))
-               goto rearm;
-
        /*
         * If devcoredump not captured and GuC capture for the job is not ready
         * do manual capture first and decide later if we need to use it