[PATCH v5 7/9] drm/i915/gvt: define weight according to vGPU type

Gao, Ping A ping.a.gao at intel.com
Mon Mar 20 12:30:13 UTC 2017


On 2017/3/15 11:28, Tian, Kevin wrote:
>> From: Ping Gao
>> Sent: Thursday, March 9, 2017 8:46 AM
>>
>> The weight define proportional control of the vGPU resource between
>> vGPUs, different vGPU types has different fixed weight definition.
>> If different type vGPUs been created at the same time, the vGPU resource
>> ratio between them is equal with ratio of weight.
> better give some examples here.
>
> Also please add a TODO - we'll allow user controlled weight setting
> in the future.

OK.

>> v4: rebase on the fixed vGPU type
>> v5: rebase on the newest code and add inline comments for weight.
>>
>> Signed-off-by: Ping Gao <ping.a.gao at intel.com>
>> ---
>>  drivers/gpu/drm/i915/gvt/gvt.h          |  4 ++++
>>  drivers/gpu/drm/i915/gvt/kvmgt.c        |  6 ++++--
>>  drivers/gpu/drm/i915/gvt/sched_policy.c |  1 +
>>  drivers/gpu/drm/i915/gvt/vgpu.c         | 21 ++++++++++++++++-----
>>  4 files changed, 25 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/gvt/gvt.h b/drivers/gpu/drm/i915/gvt/gvt.h
>> index 563ed22..0f53f5d 100644
>> --- a/drivers/gpu/drm/i915/gvt/gvt.h
>> +++ b/drivers/gpu/drm/i915/gvt/gvt.h
>> @@ -151,6 +151,7 @@ struct intel_vgpu {
>>  	bool failsafe;
>>  	bool resetting;
>>  	void *sched_data;
>> +	struct intel_sched_ctl sched_ctl;
>>
>>  	struct intel_vgpu_fence fence;
>>  	struct intel_vgpu_gm gm;
>> @@ -221,6 +222,7 @@ struct intel_vgpu_type {
>>  	unsigned int low_gm_size;
>>  	unsigned int high_gm_size;
>>  	unsigned int fence;
>> +	unsigned int weight;
> do we need this field? Can we automatically calculate based on
> type and then apply to the field in vgpu structure?

The last version calculated the weight automatically base on the type as
the vGPU type is dynamic, now vGPU type is fixed and has predictable
resource definition,  I think weight should be a part of the fixed
definition.

>>  	enum intel_vgpu_edid resolution;
>>  };
>>
>> @@ -330,6 +332,8 @@ struct intel_vgpu_creation_params {
>>  	__u64 resolution;
>>  	__s32 primary;
>>  	__u64 vgpu_id;
>> +
>> +	__u32 weight;
>>  };
>>
>>  int intel_vgpu_alloc_resource(struct intel_vgpu *vgpu, diff --git
>> a/drivers/gpu/drm/i915/gvt/kvmgt.c b/drivers/gpu/drm/i915/gvt/kvmgt.c
>> index 84d8016..55be2f2 100644
>> --- a/drivers/gpu/drm/i915/gvt/kvmgt.c
>> +++ b/drivers/gpu/drm/i915/gvt/kvmgt.c
>> @@ -295,10 +295,12 @@ static ssize_t description_show(struct kobject
>> *kobj, struct device *dev,
>>  		return 0;
>>
>>  	return sprintf(buf, "low_gm_size: %dMB\nhigh_gm_size: %dMB\n"
>> -		       "fence: %d\nresolution: %s\n",
>> +		       "fence: %d\nresolution: %s\n"
>> +		       "weight: %d\n",
>>  		       BYTES_TO_MB(type->low_gm_size),
>>  		       BYTES_TO_MB(type->high_gm_size),
>> -		       type->fence, vgpu_edid_str(type->resolution));
>> +		       type->fence, vgpu_edid_str(type->resolution),
>> +		       type->weight);
>>  }
>>
>>  static MDEV_TYPE_ATTR_RO(available_instances);
>> diff --git a/drivers/gpu/drm/i915/gvt/sched_policy.c
>> b/drivers/gpu/drm/i915/gvt/sched_policy.c
>> index e0311c8..8fd1fa3 100644
>> --- a/drivers/gpu/drm/i915/gvt/sched_policy.c
>> +++ b/drivers/gpu/drm/i915/gvt/sched_policy.c
>> @@ -340,6 +340,7 @@ static int tbs_sched_init_vgpu(struct intel_vgpu
>> *vgpu)
>>  	if (!data)
>>  		return -ENOMEM;
>>
>> +	data->sched_ctl.weight = vgpu->sched_ctl.weight;
>>  	data->vgpu = vgpu;
>>  	INIT_LIST_HEAD(&data->list);
>>  	INIT_LIST_HEAD(&data->lru_list);
>> diff --git a/drivers/gpu/drm/i915/gvt/vgpu.c
>> b/drivers/gpu/drm/i915/gvt/vgpu.c index 150c26d..3e652e2 100644
>> --- a/drivers/gpu/drm/i915/gvt/vgpu.c
>> +++ b/drivers/gpu/drm/i915/gvt/vgpu.c
>> @@ -68,14 +68,21 @@ static struct {
>>  	unsigned int low_mm;
>>  	unsigned int high_mm;
>>  	unsigned int fence;
>> +
>> +	/* A vGPU with a weight of 8 will get twice as much GPU
>> +	 * as a vGPU with a weight of 4 on a contended host. Legal
>> +	 * weights range from 1 to 65535 and different vGPU type
>> +	 * has different weight set.
>> +	 */
>> +	unsigned int weight;
> please define a macro for such range limitation

OK.

>
>>  	enum intel_vgpu_edid edid;
>>  	char *name;
>>  } vgpu_types[] = {
>>  /* Fixed vGPU type table */
>> -	{ MB_TO_BYTES(64), MB_TO_BYTES(512), 4, GVT_EDID_1024_768,
>> "8" },
>> -	{ MB_TO_BYTES(128), MB_TO_BYTES(512), 4, GVT_EDID_1920_1200,
>> "4" },
>> -	{ MB_TO_BYTES(256), MB_TO_BYTES(1024), 4,
>> GVT_EDID_1920_1200, "2" },
>> -	{ MB_TO_BYTES(512), MB_TO_BYTES(2048), 4,
>> GVT_EDID_1920_1200, "1" },
>> +	{ MB_TO_BYTES(64), MB_TO_BYTES(512), 4, 1, GVT_EDID_1024_768,
>> "8" },
>> +	{ MB_TO_BYTES(128), MB_TO_BYTES(512), 4, 2,
>> GVT_EDID_1920_1200, "4" },
>> +	{ MB_TO_BYTES(256), MB_TO_BYTES(1024), 4, 4,
>> GVT_EDID_1920_1200, "2" },
>> +	{ MB_TO_BYTES(512), MB_TO_BYTES(2048), 4, 8,
>> GVT_EDID_1920_1200, "1"
>> +},
>>  };
>>
>>  /**
>> @@ -120,6 +127,7 @@ int intel_gvt_init_vgpu_types(struct intel_gvt *gvt)
>>  		gvt->types[i].low_gm_size = vgpu_types[i].low_mm;
>>  		gvt->types[i].high_gm_size = vgpu_types[i].high_mm;
>>  		gvt->types[i].fence = vgpu_types[i].fence;
>> +		gvt->types[i].weight = vgpu_types[i].weight;
>>  		gvt->types[i].resolution = vgpu_types[i].edid;
>>  		gvt->types[i].avail_instance = min(low_avail /
>> vgpu_types[i].low_mm,
>>  						   high_avail /
>> vgpu_types[i].high_mm); @@ -131,11 +139,12 @@ int
>> intel_gvt_init_vgpu_types(struct intel_gvt *gvt)
>>  			sprintf(gvt->types[i].name, "GVTg_V5_%s",
>>  						vgpu_types[i].name);
>>
>> -		gvt_dbg_core("type[%d]: %s avail %u low %u high %u fence
>> %u res %s\n",
>> +		gvt_dbg_core("type[%d]: %s avail %u low %u high %u fence
>> %u weight %u
>> +res %s\n",
>>  			     i, gvt->types[i].name,
>>  			     gvt->types[i].avail_instance,
>>  			     gvt->types[i].low_gm_size,
>>  			     gvt->types[i].high_gm_size, gvt->types[i].fence,
>> +			     gvt->types[i].weight,
>>  			     vgpu_edid_str(gvt->types[i].resolution));
>>  	}
>>
>> @@ -290,6 +299,7 @@ static struct intel_vgpu
>> *__intel_gvt_create_vgpu(struct intel_gvt *gvt,
>>  	vgpu->id = ret;
>>  	vgpu->handle = param->handle;
>>  	vgpu->gvt = gvt;
>> +	vgpu->sched_ctl.weight = param->weight;
>>  	bitmap_zero(vgpu->tlb_handle_pending, I915_NUM_ENGINES);
>>
>>  	intel_vgpu_init_cfg_space(vgpu, param->primary); @@ -376,6 +386,7
>> @@ struct intel_vgpu *intel_gvt_create_vgpu(struct intel_gvt *gvt,
>>  	param.low_gm_sz = type->low_gm_size;
>>  	param.high_gm_sz = type->high_gm_size;
>>  	param.fence_sz = type->fence;
>> +	param.weight = type->weight;
>>  	param.resolution = type->resolution;
>>
>>  	/* XXX current param based on MB */
>> --
>> 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