]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
drm/i915/gvt: Use real time to do timer check
authorZhipeng Gong <zhipeng.gong@intel.com>
Wed, 4 Apr 2018 00:43:52 +0000 (08:43 +0800)
committerZhi Wang <zhi.a.wang@intel.com>
Mon, 23 Apr 2018 05:09:31 +0000 (13:09 +0800)
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>
drivers/gpu/drm/i915/gvt/sched_policy.c

index 75b7bc7b344cd995eafed316db72c83dfd18d0fc..8876a57f407cfb99ed70317db0cebc41d60a3e54 100644 (file)
@@ -66,6 +66,7 @@ struct gvt_sched_data {
        struct hrtimer timer;
        unsigned long period;
        struct list_head lru_runq_head;
+       ktime_t expire_time;
 };
 
 static void vgpu_update_timeslice(struct intel_vgpu *pre_vgpu)
@@ -226,14 +227,18 @@ out:
 void intel_gvt_schedule(struct intel_gvt *gvt)
 {
        struct gvt_sched_data *sched_data = gvt->scheduler.sched_data;
-       static uint64_t timer_check;
 
        mutex_lock(&gvt->lock);
 
        if (test_and_clear_bit(INTEL_GVT_REQUEST_SCHED,
                                (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);
+                       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);