diff options
author | Ping Gao <ping.a.gao@intel.com> | 2017-05-24 08:30:17 -0400 |
---|---|---|
committer | Zhenyu Wang <zhenyuw@linux.intel.com> | 2017-06-08 01:59:16 -0400 |
commit | c713cb2f9b7e1e9ffa8a379cecb13bc6eacd49b6 (patch) | |
tree | f32339ea16083a9c68508e535451e1d84896459a | |
parent | 089f93c3f94c368157980578b1efc4f6014ebd97 (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.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/gvt.h | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/sched_policy.c | 15 |
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 | ||
257 | enum { | 257 | enum { |
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 | ||
262 | static inline void intel_gvt_request_service(struct intel_gvt *gvt, | 267 | static 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: | |||
227 | void intel_gvt_schedule(struct intel_gvt *gvt) | 222 | void 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 | ||