drm/i915/gvt: Support event based scheduling
authorPing Gao <ping.a.gao@intel.com>
Wed, 24 May 2017 12:30:17 +0000 (20:30 +0800)
committerZhenyu Wang <zhenyuw@linux.intel.com>
Thu, 8 Jun 2017 05:59:16 +0000 (13:59 +0800)
This patch decouple the time slice calculation and scheduler, let
other event be able to trigger scheduling without impact the
calculation for QoS.

v2: add only one new enum definition.
v3: fix typo.

Signed-off-by: Ping Gao <ping.a.gao@intel.com>
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
drivers/gpu/drm/i915/gvt/gvt.c
drivers/gpu/drm/i915/gvt/gvt.h
drivers/gpu/drm/i915/gvt/sched_policy.c

index 20329171e4ab5a51a5e42e2eca749c207e70389e..c27c6838eacae08d03b3551fc7b62b8bceba1273 100644 (file)
@@ -147,7 +147,9 @@ static int gvt_service_thread(void *data)
                        mutex_unlock(&gvt->lock);
                }
 
-               if (test_and_clear_bit(INTEL_GVT_REQUEST_SCHED,
+               if (test_bit(INTEL_GVT_REQUEST_SCHED,
+                               (void *)&gvt->service_request) ||
+                       test_bit(INTEL_GVT_REQUEST_EVENT_SCHED,
                                        (void *)&gvt->service_request)) {
                        intel_gvt_schedule(gvt);
                }
index d3b4d42063dacf6eba88762dd797aa83930623dd..8fd40f55caf16e91343bf729db2222706925a163 100644 (file)
@@ -256,7 +256,12 @@ static inline struct intel_gvt *to_gvt(struct drm_i915_private *i915)
 
 enum {
        INTEL_GVT_REQUEST_EMULATE_VBLANK = 0,
+
+       /* Scheduling trigger by timer */
        INTEL_GVT_REQUEST_SCHED = 1,
+
+       /* Scheduling trigger by event */
+       INTEL_GVT_REQUEST_EVENT_SCHED = 2,
 };
 
 static inline void intel_gvt_request_service(struct intel_gvt *gvt,
index f642a3f0cfa02fe4304f7d2c05238eaad7a1b7ba..6f2073d74de2d102c01d9a955d37f575e11d724b 100644 (file)
@@ -198,11 +198,6 @@ static void tbs_sched_func(struct gvt_sched_data *sched_data)
        struct intel_gvt_workload_scheduler *scheduler = &gvt->scheduler;
        struct vgpu_sched_data *vgpu_data;
        struct intel_vgpu *vgpu = NULL;
-       static uint64_t timer_check;
-
-       if (!(timer_check++ % GVT_TS_BALANCE_PERIOD_MS))
-               gvt_balance_timeslice(sched_data);
-
        /* no active vgpu or has already had a target */
        if (list_empty(&sched_data->lru_runq_head) || scheduler->next_vgpu)
                goto out;
@@ -227,9 +222,19 @@ 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))
+                       gvt_balance_timeslice(sched_data);
+       }
+       clear_bit(INTEL_GVT_REQUEST_EVENT_SCHED, (void *)&gvt->service_request);
+
        tbs_sched_func(sched_data);
+
        mutex_unlock(&gvt->lock);
 }