[PATCH v4 4/9] drm/i915/gvt: add some statistic routine for scheduler

Zhenyu Wang zhenyuw at linux.intel.com
Wed Mar 8 10:07:36 UTC 2017


On 2017.03.08 14:24:31 +0800, Ping Gao wrote:
> Add some statistic routine to collect the time when vGPU
> schedule in/out and the time of the last ctx submission.
> 
> Rename some schedule structure.
> 
> Signed-off-by: Ping Gao <ping.a.gao at intel.com>
> ---

Why must use cycles_t based counting? Looks the time precision for
vgpu scheduling is not that high, e.g 100ms. ktime based solution
is not enough?

>  
> +struct vgpu_sched_data {
> +	struct list_head list;
> +	struct intel_vgpu *vgpu;
> +
> +	/* per-vgpu sched stats */
> +	int64_t sched_in_time;
> +	int64_t sched_out_time;
> +	int64_t sched_time;
> +	int64_t ts_usage;
> +	int64_t ts_alloc;
> +

why int64? To handle cycles count overflow?

> +	struct intel_sched_ctl sched_ctl;
> +};
> +
> +struct gvt_sched_data {
> +	struct intel_gvt *gvt;
> +	struct hrtimer timer;
> +	unsigned long period;
> +	struct list_head runq_head;
> +};
> +
>  static void try_to_schedule_next_vgpu(struct intel_gvt *gvt)
>  {
>  	struct intel_gvt_workload_scheduler *scheduler = &gvt->scheduler;
>  	enum intel_engine_id i;
>  	struct intel_engine_cs *engine;
> +	struct vgpu_sched_data *vgpu_data;
> +	cycles_t cur_cycles;
>  
>  	/* no target to schedule */
>  	if (!scheduler->next_vgpu)
> @@ -77,6 +100,14 @@ static void try_to_schedule_next_vgpu(struct intel_gvt *gvt)
>  	gvt_dbg_sched("switch to next vgpu %d\n",
>  			scheduler->next_vgpu->id);
>  
> +	cur_cycles = get_cycles();
> +	if (scheduler->current_vgpu) {
> +		vgpu_data = scheduler->current_vgpu->sched_data;
> +		vgpu_data->sched_out_time = cur_cycles;
> +	}
> +	vgpu_data = scheduler->next_vgpu->sched_data;
> +	vgpu_data->sched_in_time = cur_cycles;
> +
>  	/* switch current vgpu */
>  	scheduler->current_vgpu = scheduler->next_vgpu;
>  	scheduler->next_vgpu = NULL;
> @@ -88,19 +119,6 @@ static void try_to_schedule_next_vgpu(struct intel_gvt *gvt)
>  		wake_up(&scheduler->waitq[i]);
>  }
>  
> -struct tbs_vgpu_data {
> -	struct list_head list;
> -	struct intel_vgpu *vgpu;
> -	/* put some per-vgpu sched stats here */
> -};
> -
> -struct tbs_sched_data {
> -	struct intel_gvt *gvt;
> -	struct hrtimer timer;
> -	unsigned long period;
> -	struct list_head runq_head;
> -};
> -
>  enum {
>  	NON_VGPU_SCHED = 0,
>  	ONLY_IDLE_VGPU_SCHED,
> @@ -109,9 +127,9 @@ enum {
>  
>  #define GVT_DEFAULT_TIME_SLICE 1000000
>  
> -static void tbs_sched_func(struct tbs_sched_data *sched_data)
> +static void tbs_sched_func(struct gvt_sched_data *sched_data)
>  {
> -	struct tbs_vgpu_data *vgpu_data;
> +	struct vgpu_sched_data *vgpu_data;
>  
>  	struct intel_gvt *gvt = sched_data->gvt;
>  	struct intel_gvt_workload_scheduler *scheduler = &gvt->scheduler;
> @@ -136,7 +154,7 @@ static void tbs_sched_func(struct tbs_sched_data *sched_data)
>  		if (pos == &sched_data->runq_head)
>  			continue;
>  
> -		vgpu_data = container_of(pos, struct tbs_vgpu_data, list);
> +		vgpu_data = container_of(pos, struct vgpu_sched_data, list);
>  		if (!vgpu_has_pending_workload(vgpu_data->vgpu))
>  			continue;
>  
> @@ -158,7 +176,7 @@ static void tbs_sched_func(struct tbs_sched_data *sched_data)
>  
>  void intel_gvt_schedule(struct intel_gvt *gvt)
>  {
> -	struct tbs_sched_data *sched_data = gvt->scheduler.sched_data;
> +	struct gvt_sched_data *sched_data = gvt->scheduler.sched_data;
>  
>  	mutex_lock(&gvt->lock);
>  	tbs_sched_func(sched_data);
> @@ -167,9 +185,9 @@ void intel_gvt_schedule(struct intel_gvt *gvt)
>  
>  static enum hrtimer_restart tbs_timer_fn(struct hrtimer *timer_data)
>  {
> -	struct tbs_sched_data *data;
> +	struct gvt_sched_data *data;
>  
> -	data = container_of(timer_data, struct tbs_sched_data, timer);
> +	data = container_of(timer_data, struct gvt_sched_data, timer);
>  
>  	intel_gvt_request_service(data->gvt, INTEL_GVT_REQUEST_SCHED);
>  
> @@ -183,7 +201,7 @@ static int tbs_sched_init(struct intel_gvt *gvt)
>  	struct intel_gvt_workload_scheduler *scheduler =
>  		&gvt->scheduler;
>  
> -	struct tbs_sched_data *data;
> +	struct gvt_sched_data *data;
>  
>  	data = kzalloc(sizeof(*data), GFP_KERNEL);
>  	if (!data)
> @@ -204,7 +222,7 @@ static void tbs_sched_clean(struct intel_gvt *gvt)
>  {
>  	struct intel_gvt_workload_scheduler *scheduler =
>  		&gvt->scheduler;
> -	struct tbs_sched_data *data = scheduler->sched_data;
> +	struct gvt_sched_data *data = scheduler->sched_data;
>  
>  	hrtimer_cancel(&data->timer);
>  
> @@ -214,7 +232,7 @@ static void tbs_sched_clean(struct intel_gvt *gvt)
>  
>  static int tbs_sched_init_vgpu(struct intel_vgpu *vgpu)
>  {
> -	struct tbs_vgpu_data *data;
> +	struct vgpu_sched_data *data;
>  
>  	data = kzalloc(sizeof(*data), GFP_KERNEL);
>  	if (!data)
> @@ -235,8 +253,8 @@ static void tbs_sched_clean_vgpu(struct intel_vgpu *vgpu)
>  
>  static void tbs_sched_start_schedule(struct intel_vgpu *vgpu)
>  {
> -	struct tbs_sched_data *sched_data = vgpu->gvt->scheduler.sched_data;
> -	struct tbs_vgpu_data *vgpu_data = vgpu->sched_data;
> +	struct gvt_sched_data *sched_data = vgpu->gvt->scheduler.sched_data;
> +	struct vgpu_sched_data *vgpu_data = vgpu->sched_data;
>  
>  	if (!list_empty(&vgpu_data->list))
>  		return;
> @@ -251,8 +269,8 @@ static void tbs_sched_start_schedule(struct intel_vgpu *vgpu)
>  
>  static void tbs_sched_stop_schedule(struct intel_vgpu *vgpu)
>  {
> -	struct tbs_sched_data *sched_data = vgpu->gvt->scheduler.sched_data;
> -	struct tbs_vgpu_data *vgpu_data = vgpu->sched_data;
> +	struct gvt_sched_data *sched_data = vgpu->gvt->scheduler.sched_data;
> +	struct vgpu_sched_data *vgpu_data = vgpu->sched_data;
>  
>  	if (list_empty(&vgpu_data->list))
>  		return;
> -- 
> 2.7.4
> 
> _______________________________________________
> intel-gvt-dev mailing list
> intel-gvt-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gvt-dev

-- 
Open Source Technology Center, Intel ltd.

$gpg --keyserver wwwkeys.pgp.net --recv-keys 4D781827
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 163 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/intel-gvt-dev/attachments/20170308/8dbb0572/attachment.sig>


More information about the intel-gvt-dev mailing list