diff options
author | Ping Gao <ping.a.gao@intel.com> | 2017-03-29 12:36:37 -0400 |
---|---|---|
committer | Zhenyu Wang <zhenyuw@linux.intel.com> | 2017-03-30 01:33:58 -0400 |
commit | bc90d097ae144fab1f789f8523b621de7125c6a8 (patch) | |
tree | 44601a644c9de39dfa6900d51412faab207b0152 | |
parent | 32356920dae17ef3b04fe02a113418c983fc66ce (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.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/kvmgt.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/sched_policy.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/vgpu.c | 29 |
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 | ||
333 | int intel_vgpu_alloc_resource(struct intel_vgpu *vgpu, | 337 | 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 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 | ||
304 | static MDEV_TYPE_ATTR_RO(available_instances); | 306 | 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 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 | |||
67 | static struct { | 71 | static 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 */ |