aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPing Gao <ping.a.gao@intel.com>2017-03-29 12:36:37 -0400
committerZhenyu Wang <zhenyuw@linux.intel.com>2017-03-30 01:33:58 -0400
commitbc90d097ae144fab1f789f8523b621de7125c6a8 (patch)
tree44601a644c9de39dfa6900d51412faab207b0152
parent32356920dae17ef3b04fe02a113418c983fc66ce (diff)
drm/i915/gvt: define weight according to vGPU type
The weight defines proportional control of physical GPU resource shared between vGPUs. So far the weight is tied to a specific vGPU type, i.e when creating multiple vGPUs with different types, they will inherit different weights. e.g. The weight of type GVTg_V5_2 is 8, the weight of type GVTg_V5_4 is 4, so vGPU of type GVTg_V5_2 has double vGPU resource of vGPU type GVTg_V5_4. TODO: allow user control the weight setting in the future. Signed-off-by: Ping Gao <ping.a.gao@intel.com> Reviewed-by: Kevin Tian <kevin.tian@intel.com> Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
-rw-r--r--drivers/gpu/drm/i915/gvt/gvt.h4
-rw-r--r--drivers/gpu/drm/i915/gvt/kvmgt.c6
-rw-r--r--drivers/gpu/drm/i915/gvt/sched_policy.c1
-rw-r--r--drivers/gpu/drm/i915/gvt/vgpu.c29
4 files changed, 33 insertions, 7 deletions
diff --git a/drivers/gpu/drm/i915/gvt/gvt.h b/drivers/gpu/drm/i915/gvt/gvt.h
index fe7f5ae8884a..0631f64e06db 100644
--- a/drivers/gpu/drm/i915/gvt/gvt.h
+++ b/drivers/gpu/drm/i915/gvt/gvt.h
@@ -151,6 +151,7 @@ struct intel_vgpu {
151 bool failsafe; 151 bool failsafe;
152 bool resetting; 152 bool resetting;
153 void *sched_data; 153 void *sched_data;
154 struct vgpu_sched_ctl sched_ctl;
154 155
155 struct intel_vgpu_fence fence; 156 struct intel_vgpu_fence fence;
156 struct intel_vgpu_gm gm; 157 struct intel_vgpu_gm gm;
@@ -220,6 +221,7 @@ struct intel_vgpu_type {
220 unsigned int low_gm_size; 221 unsigned int low_gm_size;
221 unsigned int high_gm_size; 222 unsigned int high_gm_size;
222 unsigned int fence; 223 unsigned int fence;
224 unsigned int weight;
223 enum intel_vgpu_edid resolution; 225 enum intel_vgpu_edid resolution;
224}; 226};
225 227
@@ -328,6 +330,8 @@ struct intel_vgpu_creation_params {
328 __u64 resolution; 330 __u64 resolution;
329 __s32 primary; 331 __s32 primary;
330 __u64 vgpu_id; 332 __u64 vgpu_id;
333
334 __u32 weight;
331}; 335};
332 336
333int intel_vgpu_alloc_resource(struct intel_vgpu *vgpu, 337int 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 65bcf6096e5e..5f55d89a0959 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,
295 return 0; 295 return 0;
296 296
297 return sprintf(buf, "low_gm_size: %dMB\nhigh_gm_size: %dMB\n" 297 return sprintf(buf, "low_gm_size: %dMB\nhigh_gm_size: %dMB\n"
298 "fence: %d\nresolution: %s\n", 298 "fence: %d\nresolution: %s\n"
299 "weight: %d\n",
299 BYTES_TO_MB(type->low_gm_size), 300 BYTES_TO_MB(type->low_gm_size),
300 BYTES_TO_MB(type->high_gm_size), 301 BYTES_TO_MB(type->high_gm_size),
301 type->fence, vgpu_edid_str(type->resolution)); 302 type->fence, vgpu_edid_str(type->resolution),
303 type->weight);
302} 304}
303 305
304static MDEV_TYPE_ATTR_RO(available_instances); 306static 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 15e0c3b53d93..5aa7a2539e4d 100644
--- a/drivers/gpu/drm/i915/gvt/sched_policy.c
+++ b/drivers/gpu/drm/i915/gvt/sched_policy.c
@@ -237,6 +237,7 @@ static int tbs_sched_init_vgpu(struct intel_vgpu *vgpu)
237 if (!data) 237 if (!data)
238 return -ENOMEM; 238 return -ENOMEM;
239 239
240 data->sched_ctl.weight = vgpu->sched_ctl.weight;
240 data->vgpu = vgpu; 241 data->vgpu = vgpu;
241 INIT_LIST_HEAD(&data->lru_list); 242 INIT_LIST_HEAD(&data->lru_list);
242 243
diff --git a/drivers/gpu/drm/i915/gvt/vgpu.c b/drivers/gpu/drm/i915/gvt/vgpu.c
index d8d128625331..36c107e2058a 100644
--- a/drivers/gpu/drm/i915/gvt/vgpu.c
+++ b/drivers/gpu/drm/i915/gvt/vgpu.c
@@ -64,18 +64,28 @@ void populate_pvinfo_page(struct intel_vgpu *vgpu)
64 WARN_ON(sizeof(struct vgt_if) != VGT_PVINFO_SIZE); 64 WARN_ON(sizeof(struct vgt_if) != VGT_PVINFO_SIZE);
65} 65}
66 66
67#define VGPU_MAX_WEIGHT 16
68#define VGPU_WEIGHT(vgpu_num) \
69 (VGPU_MAX_WEIGHT / (vgpu_num))
70
67static struct { 71static struct {
68 unsigned int low_mm; 72 unsigned int low_mm;
69 unsigned int high_mm; 73 unsigned int high_mm;
70 unsigned int fence; 74 unsigned int fence;
75
76 /* A vGPU with a weight of 8 will get twice as much GPU as a vGPU
77 * with a weight of 4 on a contended host, different vGPU type has
78 * different weight set. Legal weights range from 1 to 16.
79 */
80 unsigned int weight;
71 enum intel_vgpu_edid edid; 81 enum intel_vgpu_edid edid;
72 char *name; 82 char *name;
73} vgpu_types[] = { 83} vgpu_types[] = {
74/* Fixed vGPU type table */ 84/* Fixed vGPU type table */
75 { MB_TO_BYTES(64), MB_TO_BYTES(384), 4, GVT_EDID_1024_768, "8" }, 85 { MB_TO_BYTES(64), MB_TO_BYTES(384), 4, VGPU_WEIGHT(8), GVT_EDID_1024_768, "8" },
76 { MB_TO_BYTES(128), MB_TO_BYTES(512), 4, GVT_EDID_1920_1200, "4" }, 86 { MB_TO_BYTES(128), MB_TO_BYTES(512), 4, VGPU_WEIGHT(4), GVT_EDID_1920_1200, "4" },
77 { MB_TO_BYTES(256), MB_TO_BYTES(1024), 4, GVT_EDID_1920_1200, "2" }, 87 { MB_TO_BYTES(256), MB_TO_BYTES(1024), 4, VGPU_WEIGHT(2), GVT_EDID_1920_1200, "2" },
78 { MB_TO_BYTES(512), MB_TO_BYTES(2048), 4, GVT_EDID_1920_1200, "1" }, 88 { MB_TO_BYTES(512), MB_TO_BYTES(2048), 4, VGPU_WEIGHT(1), GVT_EDID_1920_1200, "1" },
79}; 89};
80 90
81/** 91/**
@@ -120,6 +130,12 @@ int intel_gvt_init_vgpu_types(struct intel_gvt *gvt)
120 gvt->types[i].low_gm_size = vgpu_types[i].low_mm; 130 gvt->types[i].low_gm_size = vgpu_types[i].low_mm;
121 gvt->types[i].high_gm_size = vgpu_types[i].high_mm; 131 gvt->types[i].high_gm_size = vgpu_types[i].high_mm;
122 gvt->types[i].fence = vgpu_types[i].fence; 132 gvt->types[i].fence = vgpu_types[i].fence;
133
134 if (vgpu_types[i].weight < 1 ||
135 vgpu_types[i].weight > VGPU_MAX_WEIGHT)
136 return -EINVAL;
137
138 gvt->types[i].weight = vgpu_types[i].weight;
123 gvt->types[i].resolution = vgpu_types[i].edid; 139 gvt->types[i].resolution = vgpu_types[i].edid;
124 gvt->types[i].avail_instance = min(low_avail / vgpu_types[i].low_mm, 140 gvt->types[i].avail_instance = min(low_avail / vgpu_types[i].low_mm,
125 high_avail / vgpu_types[i].high_mm); 141 high_avail / vgpu_types[i].high_mm);
@@ -131,11 +147,12 @@ int intel_gvt_init_vgpu_types(struct intel_gvt *gvt)
131 sprintf(gvt->types[i].name, "GVTg_V5_%s", 147 sprintf(gvt->types[i].name, "GVTg_V5_%s",
132 vgpu_types[i].name); 148 vgpu_types[i].name);
133 149
134 gvt_dbg_core("type[%d]: %s avail %u low %u high %u fence %u res %s\n", 150 gvt_dbg_core("type[%d]: %s avail %u low %u high %u fence %u weight %u res %s\n",
135 i, gvt->types[i].name, 151 i, gvt->types[i].name,
136 gvt->types[i].avail_instance, 152 gvt->types[i].avail_instance,
137 gvt->types[i].low_gm_size, 153 gvt->types[i].low_gm_size,
138 gvt->types[i].high_gm_size, gvt->types[i].fence, 154 gvt->types[i].high_gm_size, gvt->types[i].fence,
155 gvt->types[i].weight,
139 vgpu_edid_str(gvt->types[i].resolution)); 156 vgpu_edid_str(gvt->types[i].resolution));
140 } 157 }
141 158
@@ -239,6 +256,7 @@ static struct intel_vgpu *__intel_gvt_create_vgpu(struct intel_gvt *gvt,
239 vgpu->id = ret; 256 vgpu->id = ret;
240 vgpu->handle = param->handle; 257 vgpu->handle = param->handle;
241 vgpu->gvt = gvt; 258 vgpu->gvt = gvt;
259 vgpu->sched_ctl.weight = param->weight;
242 bitmap_zero(vgpu->tlb_handle_pending, I915_NUM_ENGINES); 260 bitmap_zero(vgpu->tlb_handle_pending, I915_NUM_ENGINES);
243 261
244 intel_vgpu_init_cfg_space(vgpu, param->primary); 262 intel_vgpu_init_cfg_space(vgpu, param->primary);
@@ -325,6 +343,7 @@ struct intel_vgpu *intel_gvt_create_vgpu(struct intel_gvt *gvt,
325 param.low_gm_sz = type->low_gm_size; 343 param.low_gm_sz = type->low_gm_size;
326 param.high_gm_sz = type->high_gm_size; 344 param.high_gm_sz = type->high_gm_size;
327 param.fence_sz = type->fence; 345 param.fence_sz = type->fence;
346 param.weight = type->weight;
328 param.resolution = type->resolution; 347 param.resolution = type->resolution;
329 348
330 /* XXX current param based on MB */ 349 /* XXX current param based on MB */