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>
This commit is contained in:
parent
089f93c3f9
commit
c713cb2f9b
|
@ -147,7 +147,9 @@ static int gvt_service_thread(void *data)
|
||||||
mutex_unlock(&gvt->lock);
|
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)) {
|
(void *)&gvt->service_request)) {
|
||||||
intel_gvt_schedule(gvt);
|
intel_gvt_schedule(gvt);
|
||||||
}
|
}
|
||||||
|
|
|
@ -256,7 +256,12 @@ static inline struct intel_gvt *to_gvt(struct drm_i915_private *i915)
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
INTEL_GVT_REQUEST_EMULATE_VBLANK = 0,
|
INTEL_GVT_REQUEST_EMULATE_VBLANK = 0,
|
||||||
|
|
||||||
|
/* Scheduling trigger by timer */
|
||||||
INTEL_GVT_REQUEST_SCHED = 1,
|
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,
|
static inline void intel_gvt_request_service(struct intel_gvt *gvt,
|
||||||
|
|
|
@ -198,11 +198,6 @@ static void tbs_sched_func(struct gvt_sched_data *sched_data)
|
||||||
struct intel_gvt_workload_scheduler *scheduler = &gvt->scheduler;
|
struct intel_gvt_workload_scheduler *scheduler = &gvt->scheduler;
|
||||||
struct vgpu_sched_data *vgpu_data;
|
struct vgpu_sched_data *vgpu_data;
|
||||||
struct intel_vgpu *vgpu = NULL;
|
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 */
|
/* no active vgpu or has already had a target */
|
||||||
if (list_empty(&sched_data->lru_runq_head) || scheduler->next_vgpu)
|
if (list_empty(&sched_data->lru_runq_head) || scheduler->next_vgpu)
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -227,9 +222,19 @@ out:
|
||||||
void intel_gvt_schedule(struct intel_gvt *gvt)
|
void intel_gvt_schedule(struct intel_gvt *gvt)
|
||||||
{
|
{
|
||||||
struct gvt_sched_data *sched_data = gvt->scheduler.sched_data;
|
struct gvt_sched_data *sched_data = gvt->scheduler.sched_data;
|
||||||
|
static uint64_t timer_check;
|
||||||
|
|
||||||
mutex_lock(&gvt->lock);
|
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);
|
tbs_sched_func(sched_data);
|
||||||
|
|
||||||
mutex_unlock(&gvt->lock);
|
mutex_unlock(&gvt->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue