aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZhipeng Gong <zhipeng.gong@intel.com>2018-04-03 20:43:52 -0400
committerZhi Wang <zhi.a.wang@intel.com>2018-04-23 01:09:31 -0400
commit292bb0d38a5714440b59ef910404408d5e9a8017 (patch)
tree8b83b7f54e5273710fb9fc4fca5962ec81687fa9
parentfadec6eefe232696c5c471b40df33e6db616e854 (diff)
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: Zhipeng Gong <zhipeng.gong@intel.com> Cc: Zhenyu Wang <zhenyuw@linux.intel.com> Cc: Min He <min.he@intel.com> Signed-off-by: Zhi Wang <zhi.a.wang@intel.com>
-rw-r--r--drivers/gpu/drm/i915/gvt/sched_policy.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/gvt/sched_policy.c b/drivers/gpu/drm/i915/gvt/sched_policy.c
index 75b7bc7b344c..8876a57f407c 100644
--- a/drivers/gpu/drm/i915/gvt/sched_policy.c
+++ b/drivers/gpu/drm/i915/gvt/sched_policy.c
@@ -66,6 +66,7 @@ struct gvt_sched_data {
66 struct hrtimer timer; 66 struct hrtimer timer;
67 unsigned long period; 67 unsigned long period;
68 struct list_head lru_runq_head; 68 struct list_head lru_runq_head;
69 ktime_t expire_time;
69}; 70};
70 71
71static void vgpu_update_timeslice(struct intel_vgpu *pre_vgpu) 72static void vgpu_update_timeslice(struct intel_vgpu *pre_vgpu)
@@ -226,14 +227,18 @@ out:
226void intel_gvt_schedule(struct intel_gvt *gvt) 227void intel_gvt_schedule(struct intel_gvt *gvt)
227{ 228{
228 struct gvt_sched_data *sched_data = gvt->scheduler.sched_data; 229 struct gvt_sched_data *sched_data = gvt->scheduler.sched_data;
229 static uint64_t timer_check;
230 230
231 mutex_lock(&gvt->lock); 231 mutex_lock(&gvt->lock);
232 232
233 if (test_and_clear_bit(INTEL_GVT_REQUEST_SCHED, 233 if (test_and_clear_bit(INTEL_GVT_REQUEST_SCHED,
234 (void *)&gvt->service_request)) { 234 (void *)&gvt->service_request)) {
235 if (!(timer_check++ % GVT_TS_BALANCE_PERIOD_MS)) 235 ktime_t cur_time = ktime_get();
236
237 if (cur_time >= sched_data->expire_time) {
236 gvt_balance_timeslice(sched_data); 238 gvt_balance_timeslice(sched_data);
239 sched_data->expire_time = ktime_add_ms(
240 cur_time, GVT_TS_BALANCE_PERIOD_MS);
241 }
237 } 242 }
238 clear_bit(INTEL_GVT_REQUEST_EVENT_SCHED, (void *)&gvt->service_request); 243 clear_bit(INTEL_GVT_REQUEST_EVENT_SCHED, (void *)&gvt->service_request);
239 244