Commit 292bb0d3 authored by Zhipeng Gong's avatar Zhipeng Gong Committed by Zhi Wang

drm/i915/gvt: Use real time to do timer check

intel_gvt_schedule check timer through a counter and is supposed
to wake up to increase the counter every ms.
In a system with heavy workload, gvt_service_thread can not get
a chance to run right after wake up and will be delayed several
milliseconds. As a result, one hundred counter interval means
several hundred milliseconds in real time.

This patch use real time instead of counter to do timer check.

v2: remove static variable. (Zhenyu)
v3: correct expire_time update. (Zhenyu)
Signed-off-by: default avatarZhipeng Gong <zhipeng.gong@intel.com>
Cc: Zhenyu Wang <zhenyuw@linux.intel.com>
Cc: Min He <min.he@intel.com>
Signed-off-by: default avatarZhi Wang <zhi.a.wang@intel.com>
parent fadec6ee
...@@ -66,6 +66,7 @@ struct gvt_sched_data { ...@@ -66,6 +66,7 @@ struct gvt_sched_data {
struct hrtimer timer; struct hrtimer timer;
unsigned long period; unsigned long period;
struct list_head lru_runq_head; struct list_head lru_runq_head;
ktime_t expire_time;
}; };
static void vgpu_update_timeslice(struct intel_vgpu *pre_vgpu) static void vgpu_update_timeslice(struct intel_vgpu *pre_vgpu)
...@@ -226,14 +227,18 @@ static void tbs_sched_func(struct gvt_sched_data *sched_data) ...@@ -226,14 +227,18 @@ static void tbs_sched_func(struct gvt_sched_data *sched_data)
void intel_gvt_schedule(struct intel_gvt *gvt) void intel_gvt_schedule(struct intel_gvt *gvt)
{ {
struct gvt_sched_data *sched_data = gvt->scheduler.sched_data; struct gvt_sched_data *sched_data = gvt->scheduler.sched_data;
static uint64_t timer_check;
mutex_lock(&gvt->lock); mutex_lock(&gvt->lock);
if (test_and_clear_bit(INTEL_GVT_REQUEST_SCHED, if (test_and_clear_bit(INTEL_GVT_REQUEST_SCHED,
(void *)&gvt->service_request)) { (void *)&gvt->service_request)) {
if (!(timer_check++ % GVT_TS_BALANCE_PERIOD_MS)) ktime_t cur_time = ktime_get();
if (cur_time >= sched_data->expire_time) {
gvt_balance_timeslice(sched_data); gvt_balance_timeslice(sched_data);
sched_data->expire_time = ktime_add_ms(
cur_time, GVT_TS_BALANCE_PERIOD_MS);
}
} }
clear_bit(INTEL_GVT_REQUEST_EVENT_SCHED, (void *)&gvt->service_request); clear_bit(INTEL_GVT_REQUEST_EVENT_SCHED, (void *)&gvt->service_request);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment