diff options
author | Zhipeng Gong <zhipeng.gong@intel.com> | 2018-04-03 20:43:52 -0400 |
---|---|---|
committer | Zhi Wang <zhi.a.wang@intel.com> | 2018-04-23 01:09:31 -0400 |
commit | 292bb0d38a5714440b59ef910404408d5e9a8017 (patch) | |
tree | 8b83b7f54e5273710fb9fc4fca5962ec81687fa9 | |
parent | fadec6eefe232696c5c471b40df33e6db616e854 (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.c | 9 |
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 | ||
71 | static void vgpu_update_timeslice(struct intel_vgpu *pre_vgpu) | 72 | static void vgpu_update_timeslice(struct intel_vgpu *pre_vgpu) |
@@ -226,14 +227,18 @@ out: | |||
226 | void intel_gvt_schedule(struct intel_gvt *gvt) | 227 | void 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 | ||