[PATCH v5 3/8] drm/i915/gvt: factor out the scheduler
Tian, Kevin
kevin.tian at intel.com
Wed Mar 29 02:52:00 UTC 2017
> From: Ping Gao
> Sent: Tuesday, March 28, 2017 2:48 PM
>
> Factor out the scheduler to a more clear structure, the basic logic is to find
> out next vGPU first and then schedule it. When deciding to pick up who is the
> next vGPU it includes two steps: first is to find out a vGPU who has urgent
> requirement as it's near TDR because of out-of-service for a long time,
> second is to choose the vGPU who has pending workload follow round-robin
'follow' -> 'in'
> style.
>
> Signed-off-by: Ping Gao <ping.a.gao at intel.com>
Reviewed-by: Kevin Tian <kevin.tian at intel.com> with some comment fix below.
> ---
> drivers/gpu/drm/i915/gvt/sched_policy.c | 76 ++++++++++++++++++++++++-
> --------
> 1 file changed, 57 insertions(+), 19 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gvt/sched_policy.c
> b/drivers/gpu/drm/i915/gvt/sched_policy.c
> index 3a1fe38..c6523b9 100644
> --- a/drivers/gpu/drm/i915/gvt/sched_policy.c
> +++ b/drivers/gpu/drm/i915/gvt/sched_policy.c
> @@ -118,28 +118,12 @@ static void try_to_schedule_next_vgpu(struct
> intel_gvt *gvt)
> wake_up(&scheduler->waitq[i]);
> }
>
> -#define GVT_DEFAULT_TIME_SLICE 1000000
> -
> -static void tbs_sched_func(struct gvt_sched_data *sched_data)
> +static struct intel_vgpu *find_busy_vgpu(struct list_head *head,
> + struct gvt_sched_data *sched_data)
> {
> struct vgpu_sched_data *vgpu_data;
> -
> - struct intel_gvt *gvt = sched_data->gvt;
> - struct intel_gvt_workload_scheduler *scheduler = &gvt->scheduler;
> -
> struct intel_vgpu *vgpu = NULL;
> - struct list_head *pos, *head;
> -
> - /* no vgpu or has already had a target */
> - if (list_empty(&sched_data->runq_head) || scheduler->next_vgpu)
> - goto out;
> -
> - if (scheduler->current_vgpu) {
> - vgpu_data = scheduler->current_vgpu->sched_data;
> - head = &vgpu_data->list;
> - } else {
> - head = &sched_data->runq_head;
> - }
> + struct list_head *pos;
>
> /* search a vgpu with pending workload */
> list_for_each(pos, head) {
> @@ -154,6 +138,60 @@ static void tbs_sched_func(struct gvt_sched_data
> *sched_data)
> break;
> }
>
> + return vgpu;
> +}
> +
> +static struct list_head *get_sched_head(struct gvt_sched_data
> +*sched_data) {
> + struct intel_gvt *gvt = sched_data->gvt;
> + struct intel_gvt_workload_scheduler *scheduler = &gvt->scheduler;
> + struct vgpu_sched_data *cur_vgpu_data;
> + struct list_head *head;
> +
> + if (scheduler->current_vgpu) {
> + cur_vgpu_data = scheduler->current_vgpu->sched_data;
> + head = &cur_vgpu_data->list;
> + } else {
> + gvt_dbg_sched("no current vgpu search from q head\n");
> + head = &sched_data->runq_head;
> + }
> +
> + return head;
> +}
> +
> +static struct intel_vgpu *pickup_next_vgpu(struct gvt_sched_data
> +*sched_data) {
> + struct intel_vgpu *next_vgpu = NULL;
> + struct list_head *head = NULL;
> +
> + /* The scheduler follows round-robin style, sched
> + * head means where start to choose next vGPU, it's
> + * help to decide which vGPU is first one in the
help -> helpful
> + * round-robin queue at this schedule check point,
> + * that's important to keep fairness.
> + */
> + head = get_sched_head(sched_data);
> +
> + /* Choose the vGPU which has pending workload. */
> + next_vgpu = find_busy_vgpu(head, sched_data);
> +
> + return next_vgpu;
> +}
> +
> +#define GVT_DEFAULT_TIME_SLICE 1000000
> +
> +static void tbs_sched_func(struct gvt_sched_data *sched_data) {
> + struct intel_gvt *gvt = sched_data->gvt;
> + struct intel_gvt_workload_scheduler *scheduler = &gvt->scheduler;
> + struct intel_vgpu *vgpu = NULL;
> +
> + /* no active vgpu or has already had a target */
> + if (list_empty(&sched_data->runq_head) || scheduler->next_vgpu)
> + goto out;
> +
> + /* determine which vGPU should choose as next */
useless comment
> + vgpu = pickup_next_vgpu(sched_data);
> if (vgpu) {
> scheduler->next_vgpu = vgpu;
> gvt_dbg_sched("pick next vgpu %d\n", vgpu->id);
> --
> 2.7.4
>
> _______________________________________________
> intel-gvt-dev mailing list
> intel-gvt-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gvt-dev
More information about the intel-gvt-dev
mailing list