Commit 80f9c601 authored by Matthew Brost's avatar Matthew Brost Committed by Thomas Hellström
Browse files

drm/xe: Use usleep_range for accurate long-running workload timeslicing



msleep is not very accurate in terms of how long it actually sleeps,
whereas usleep_range is precise. Replace the timeslice sleep for
long-running workloads with the more accurate usleep_range to avoid
jitter if the sleep period is less than 20ms.

Fixes: dd08ebf6 ("drm/xe: Introduce a new DRM driver for Intel GPUs")
Cc: stable@vger.kernel.org
Signed-off-by: default avatarMatthew Brost <matthew.brost@intel.com>
Reviewed-by: default avatarThomas Hellström <thomas.hellstrom@linux.intel.com>
Link: https://patch.msgid.link/20251212182847.1683222-3-matthew.brost@intel.com


(cherry picked from commit ca415c4d)
Signed-off-by: default avatarThomas Hellström <thomas.hellstrom@linux.intel.com>
parent fe3ccd24
Loading
Loading
Loading
Loading
+19 −1
Original line number Diff line number Diff line
@@ -717,6 +717,24 @@ static bool vf_recovery(struct xe_guc *guc)
	return xe_gt_recovery_pending(guc_to_gt(guc));
}

static inline void relaxed_ms_sleep(unsigned int delay_ms)
{
	unsigned long min_us, max_us;

	if (!delay_ms)
		return;

	if (delay_ms > 20) {
		msleep(delay_ms);
		return;
	}

	min_us = mul_u32_u32(delay_ms, 1000);
	max_us = min_us + 500;

	usleep_range(min_us, max_us);
}

static int wq_wait_for_space(struct xe_exec_queue *q, u32 wqi_size)
{
	struct xe_guc *guc = exec_queue_to_guc(q);
@@ -1587,7 +1605,7 @@ static void __guc_exec_queue_process_msg_suspend(struct xe_sched_msg *msg)
				since_resume_ms;

			if (wait_ms > 0 && q->guc->resume_time)
				msleep(wait_ms);
				relaxed_ms_sleep(wait_ms);

			set_exec_queue_suspended(q);
			disable_scheduling(q, false);