summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/gvt/scheduler.c
diff options
context:
space:
mode:
authorZhi Wang2016-05-04 00:26:57 +0200
committerZhenyu Wang2016-10-14 12:15:25 +0200
commitbe1da7070aeaee23ff659c1a8cd992789ff86da4 (patch)
tree90db3d03d111f2122fc62f17dbb750c48115e994 /drivers/gpu/drm/i915/gvt/scheduler.c
parentdrm/i915/gvt: vGPU context switch (diff)
downloadkernel-qcow2-linux-be1da7070aeaee23ff659c1a8cd992789ff86da4.tar.gz
kernel-qcow2-linux-be1da7070aeaee23ff659c1a8cd992789ff86da4.tar.xz
kernel-qcow2-linux-be1da7070aeaee23ff659c1a8cd992789ff86da4.zip
drm/i915/gvt: vGPU command scanner
This patch introduces a command scanner to scan guest command buffers. Signed-off-by: Yulei Zhang <yulei.zhang@intel.com> Signed-off-by: Zhi Wang <zhi.a.wang@intel.com> Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
Diffstat (limited to 'drivers/gpu/drm/i915/gvt/scheduler.c')
-rw-r--r--drivers/gpu/drm/i915/gvt/scheduler.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/gvt/scheduler.c b/drivers/gpu/drm/i915/gvt/scheduler.c
index 2f96302c7b21..732672b7d22b 100644
--- a/drivers/gpu/drm/i915/gvt/scheduler.c
+++ b/drivers/gpu/drm/i915/gvt/scheduler.c
@@ -185,6 +185,14 @@ static int dispatch_workload(struct intel_vgpu_workload *workload)
mutex_lock(&gvt->lock);
+ ret = intel_gvt_scan_and_shadow_workload(workload);
+ if (ret)
+ goto err;
+
+ ret = intel_gvt_scan_and_shadow_wa_ctx(&workload->wa_ctx);
+ if (ret)
+ goto err;
+
ret = populate_shadow_context(workload);
if (ret)
goto err;
@@ -345,6 +353,7 @@ static void complete_current_workload(struct intel_gvt *gvt, int ring_id)
{
struct intel_gvt_workload_scheduler *scheduler = &gvt->scheduler;
struct intel_vgpu_workload *workload;
+ int event;
mutex_lock(&gvt->lock);
@@ -355,6 +364,11 @@ static void complete_current_workload(struct intel_gvt *gvt, int ring_id)
!atomic_read(&workload->shadow_ctx_active));
update_guest_context(workload);
+
+ for_each_set_bit(event, workload->pending_events,
+ INTEL_GVT_EVENT_MAX)
+ intel_vgpu_trigger_virtual_event(workload->vgpu,
+ event);
}
gvt_dbg_sched("ring id %d complete workload %p status %d\n",