aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPing Gao <ping.a.gao@intel.com>2017-05-24 08:30:17 -0400
committerZhenyu Wang <zhenyuw@linux.intel.com>2017-06-08 01:59:16 -0400
commitc713cb2f9b7e1e9ffa8a379cecb13bc6eacd49b6 (patch)
treef32339ea16083a9c68508e535451e1d84896459a
parent089f93c3f94c368157980578b1efc4f6014ebd97 (diff)
drm/i915/gvt: Support event based scheduling
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>
-rw-r--r--drivers/gpu/drm/i915/gvt/gvt.c4
-rw-r--r--drivers/gpu/drm/i915/gvt/gvt.h5
-rw-r--r--drivers/gpu/drm/i915/gvt/sched_policy.c15
3 files changed, 18 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/gvt/gvt.c b/drivers/gpu/drm/i915/gvt/gvt.c
index 20329171e4ab..c27c6838eaca 100644
--- a/drivers/gpu/drm/i915/gvt/gvt.c
+++ b/drivers/gpu/drm/i915/gvt/gvt.c
@@ -147,7 +147,9 @@ static int gvt_service_thread(void *data)
147 mutex_unlock(&gvt->lock); 147 mutex_unlock(&gvt->lock);
148 } 148 }
149 149
150 if (test_and_clear_bit(INTEL_GVT_REQUEST_SCHED, 150 if (test_bit(INTEL_GVT_REQUEST_SCHED,
151 (void *)&gvt->service_request) ||
152 test_bit(INTEL_GVT_REQUEST_EVENT_SCHED,
151 (void *)&gvt->service_request)) { 153 (void *)&gvt->service_request)) {
152 intel_gvt_schedule(gvt); 154 intel_gvt_schedule(gvt);
153 } 155 }
diff --git a/drivers/gpu/drm/i915/gvt/gvt.h b/drivers/gpu/drm/i915/gvt/gvt.h
index d3b4d42063da..8fd40f55caf1 100644
--- a/drivers/gpu/drm/i915/gvt/gvt.h
+++ b/drivers/gpu/drm/i915/gvt/gvt.h
@@ -256,7 +256,12 @@ static inline struct intel_gvt *to_gvt(struct drm_i915_private *i915)
256 256
257enum { 257enum {
258 INTEL_GVT_REQUEST_EMULATE_VBLANK = 0, 258 INTEL_GVT_REQUEST_EMULATE_VBLANK = 0,
259
260 /* Scheduling trigger by timer */
259 INTEL_GVT_REQUEST_SCHED = 1, 261 INTEL_GVT_REQUEST_SCHED = 1,
262
263 /* Scheduling trigger by event */
264 INTEL_GVT_REQUEST_EVENT_SCHED = 2,
260}; 265};
261 266
262static inline void intel_gvt_request_service(struct intel_gvt *gvt, 267static inline void intel_gvt_request_service(struct intel_gvt *gvt,
diff --git a/drivers/gpu/drm/i915/gvt/sched_policy.c b/drivers/gpu/drm/i915/gvt/sched_policy.c
index f642a3f0cfa0..6f2073d74de2 100644
--- a/drivers/gpu/drm/i915/gvt/sched_policy.c
+++ b/drivers/gpu/drm/i915/gvt/sched_policy.c
@@ -198,11 +198,6 @@ static void tbs_sched_func(struct gvt_sched_data *sched_data)
198 struct intel_gvt_workload_scheduler *scheduler = &gvt->scheduler; 198 struct intel_gvt_workload_scheduler *scheduler = &gvt->scheduler;
199 struct vgpu_sched_data *vgpu_data; 199 struct vgpu_sched_data *vgpu_data;
200 struct intel_vgpu *vgpu = NULL; 200 struct intel_vgpu *vgpu = NULL;
201 static uint64_t timer_check;
202
203 if (!(timer_check++ % GVT_TS_BALANCE_PERIOD_MS))
204 gvt_balance_timeslice(sched_data);
205
206 /* no active vgpu or has already had a target */ 201 /* no active vgpu or has already had a target */
207 if (list_empty(&sched_data->lru_runq_head) || scheduler->next_vgpu) 202 if (list_empty(&sched_data->lru_runq_head) || scheduler->next_vgpu)
208 goto out; 203 goto out;
@@ -227,9 +222,19 @@ out:
227void intel_gvt_schedule(struct intel_gvt *gvt) 222void intel_gvt_schedule(struct intel_gvt *gvt)
228{ 223{
229 struct gvt_sched_data *sched_data = gvt->scheduler.sched_data; 224 struct gvt_sched_data *sched_data = gvt->scheduler.sched_data;
225 static uint64_t timer_check;
230 226
231 mutex_lock(&gvt->lock); 227 mutex_lock(&gvt->lock);
228
229 if (test_and_clear_bit(INTEL_GVT_REQUEST_SCHED,
230 (void *)&gvt->service_request)) {
231 if (!(timer_check++ % GVT_TS_BALANCE_PERIOD_MS))
232 gvt_balance_timeslice(sched_data);
233 }
234 clear_bit(INTEL_GVT_REQUEST_EVENT_SCHED, (void *)&gvt->service_request);
235
232 tbs_sched_func(sched_data); 236 tbs_sched_func(sched_data);
237
233 mutex_unlock(&gvt->lock); 238 mutex_unlock(&gvt->lock);
234} 239}
235 240