[PATCH] drm/i915/gvt: Give new born vGPU higher scheduling chance

Hang Yuan hang.yuan at linux.intel.com
Wed Aug 22 08:03:38 UTC 2018


On 08/21/2018 10:23 AM, Zhenyu Wang wrote:
> This trys to give new born vGPU with higher scheduling chance
> not only with adding to sched list head and also have higher
> priority for workload sched for 5 seconds after starting to
> schedule it. In order for fast GPU execution during VM boot,
> and ensure guest driver setup with required state given in time.
> 
> This fixes recent failure seen on one VM with multiple linux VMs running on
> kernel with commit 2621cefaa42b3("drm/i915: Provide a timeout to
> i915_gem_wait_for_idle() on setup"), which had shorter setup timeout
> that caused context state init failed.
> 
> Cc: Yuan Hang <hang.yuan at intel.com>
> Signed-off-by: Zhenyu Wang <zhenyuw at linux.intel.com>
> ---
>   drivers/gpu/drm/i915/gvt/sched_policy.c | 34 ++++++++++++++++++++-----
>   1 file changed, 27 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/gvt/sched_policy.c b/drivers/gpu/drm/i915/gvt/sched_policy.c
> index 09d7bb72b4ff..0d28702ed545 100644
> --- a/drivers/gpu/drm/i915/gvt/sched_policy.c
> +++ b/drivers/gpu/drm/i915/gvt/sched_policy.c
> @@ -47,11 +47,15 @@ static bool vgpu_has_pending_workload(struct intel_vgpu *vgpu)
>   	return false;
>   }
>   
> +/* We give 5 seconds higher prio for vGPU during start */
> +#define GVT_SCHED_VGPU_PRI_TIME  5
> +
>   struct vgpu_sched_data {
>   	struct list_head lru_list;
>   	struct intel_vgpu *vgpu;
>   	bool active;
> -
> +	bool pri_sched;
> +	ktime_t pri_time;
>   	ktime_t sched_in_time;
>   	ktime_t sched_time;
>   	ktime_t left_ts;
> @@ -183,6 +187,14 @@ static struct intel_vgpu *find_busy_vgpu(struct gvt_sched_data *sched_data)
>   		if (!vgpu_has_pending_workload(vgpu_data->vgpu))
>   			continue;
>   
> +		if (vgpu_data->pri_sched) {
> +			if (ktime_before(ktime_get(), vgpu_data->pri_time)) {
> +				vgpu = vgpu_data->vgpu;
> +				break;
> +			} else
> +				vgpu_data->pri_sched = false;
> +		}
> +
>   		/* Return the vGPU only if it has time slice left */
>   		if (vgpu_data->left_ts > 0) {
>   			vgpu = vgpu_data->vgpu;
> @@ -202,6 +214,7 @@ 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;
> +
>   	/* no active vgpu or has already had a target */
>   	if (list_empty(&sched_data->lru_runq_head) || scheduler->next_vgpu)
>   		goto out;
> @@ -209,12 +222,13 @@ static void tbs_sched_func(struct gvt_sched_data *sched_data)
>   	vgpu = find_busy_vgpu(sched_data);
>   	if (vgpu) {
>   		scheduler->next_vgpu = vgpu;
> -
> -		/* Move the last used vGPU to the tail of lru_list */
>   		vgpu_data = vgpu->sched_data;
> -		list_del_init(&vgpu_data->lru_list);
> -		list_add_tail(&vgpu_data->lru_list,
> -				&sched_data->lru_runq_head);
> +		if (!vgpu_data->pri_sched) {
> +			/* Move the last used vGPU to the tail of lru_list */
> +			list_del_init(&vgpu_data->lru_list);
> +			list_add_tail(&vgpu_data->lru_list,
> +				      &sched_data->lru_runq_head);
> +		}
>   	} else {
>   		scheduler->next_vgpu = gvt->idle_vgpu;
>   	}
Henry: just have a concern here. If another windows guest is already 
running. With the new born vGPU, the windows guest will not be scheduled 
for 5 seconds which exceeds windows default TDR time 2 seconds.

> @@ -328,11 +342,17 @@ static void tbs_sched_start_schedule(struct intel_vgpu *vgpu)
>   {
>   	struct gvt_sched_data *sched_data = vgpu->gvt->scheduler.sched_data;
>   	struct vgpu_sched_data *vgpu_data = vgpu->sched_data;
> +	ktime_t now;
>   
>   	if (!list_empty(&vgpu_data->lru_list))
>   		return;
>   
> -	list_add_tail(&vgpu_data->lru_list, &sched_data->lru_runq_head);
> +	now = ktime_get();
> +	vgpu_data->pri_time = ktime_add(now,
> +					ktime_set(GVT_SCHED_VGPU_PRI_TIME, 0));
> +	vgpu_data->pri_sched = true;
> +
> +	list_add(&vgpu_data->lru_list, &sched_data->lru_runq_head);
>   
>   	if (!hrtimer_active(&sched_data->timer))
>   		hrtimer_start(&sched_data->timer, ktime_add_ns(ktime_get(),
> 



More information about the intel-gvt-dev mailing list