aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/gvt/scheduler.c64
-rw-r--r--drivers/gpu/drm/i915/gvt/scheduler.h1
2 files changed, 43 insertions, 22 deletions
diff --git a/drivers/gpu/drm/i915/gvt/scheduler.c b/drivers/gpu/drm/i915/gvt/scheduler.c
index 1ad8c5e1455d..5567ddc7760f 100644
--- a/drivers/gpu/drm/i915/gvt/scheduler.c
+++ b/drivers/gpu/drm/i915/gvt/scheduler.c
@@ -356,6 +356,33 @@ static int set_context_ppgtt_from_shadow(struct intel_vgpu_workload *workload,
356 return 0; 356 return 0;
357} 357}
358 358
359static int
360intel_gvt_workload_req_alloc(struct intel_vgpu_workload *workload)
361{
362 struct intel_vgpu *vgpu = workload->vgpu;
363 struct intel_vgpu_submission *s = &vgpu->submission;
364 struct i915_gem_context *shadow_ctx = s->shadow_ctx;
365 struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv;
366 struct intel_engine_cs *engine = dev_priv->engine[workload->ring_id];
367 struct i915_request *rq;
368 int ret = 0;
369
370 lockdep_assert_held(&dev_priv->drm.struct_mutex);
371
372 if (workload->req)
373 goto out;
374
375 rq = i915_request_alloc(engine, shadow_ctx);
376 if (IS_ERR(rq)) {
377 gvt_vgpu_err("fail to allocate gem request\n");
378 ret = PTR_ERR(rq);
379 goto out;
380 }
381 workload->req = i915_request_get(rq);
382out:
383 return ret;
384}
385
359/** 386/**
360 * intel_gvt_scan_and_shadow_workload - audit the workload by scanning and 387 * intel_gvt_scan_and_shadow_workload - audit the workload by scanning and
361 * shadow it as well, include ringbuffer,wa_ctx and ctx. 388 * shadow it as well, include ringbuffer,wa_ctx and ctx.
@@ -372,12 +399,11 @@ int intel_gvt_scan_and_shadow_workload(struct intel_vgpu_workload *workload)
372 struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv; 399 struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv;
373 struct intel_engine_cs *engine = dev_priv->engine[workload->ring_id]; 400 struct intel_engine_cs *engine = dev_priv->engine[workload->ring_id];
374 struct intel_context *ce; 401 struct intel_context *ce;
375 struct i915_request *rq;
376 int ret; 402 int ret;
377 403
378 lockdep_assert_held(&dev_priv->drm.struct_mutex); 404 lockdep_assert_held(&dev_priv->drm.struct_mutex);
379 405
380 if (workload->req) 406 if (workload->shadow)
381 return 0; 407 return 0;
382 408
383 ret = set_context_ppgtt_from_shadow(workload, shadow_ctx); 409 ret = set_context_ppgtt_from_shadow(workload, shadow_ctx);
@@ -417,22 +443,8 @@ int intel_gvt_scan_and_shadow_workload(struct intel_vgpu_workload *workload)
417 goto err_shadow; 443 goto err_shadow;
418 } 444 }
419 445
420 rq = i915_request_alloc(engine, shadow_ctx); 446 workload->shadow = true;
421 if (IS_ERR(rq)) {
422 gvt_vgpu_err("fail to allocate gem request\n");
423 ret = PTR_ERR(rq);
424 goto err_shadow;
425 }
426 workload->req = i915_request_get(rq);
427
428 ret = populate_shadow_context(workload);
429 if (ret)
430 goto err_req;
431
432 return 0; 447 return 0;
433err_req:
434 rq = fetch_and_zero(&workload->req);
435 i915_request_put(rq);
436err_shadow: 448err_shadow:
437 release_shadow_wa_ctx(&workload->wa_ctx); 449 release_shadow_wa_ctx(&workload->wa_ctx);
438err_unpin: 450err_unpin:
@@ -671,23 +683,31 @@ static int dispatch_workload(struct intel_vgpu_workload *workload)
671 mutex_lock(&vgpu->vgpu_lock); 683 mutex_lock(&vgpu->vgpu_lock);
672 mutex_lock(&dev_priv->drm.struct_mutex); 684 mutex_lock(&dev_priv->drm.struct_mutex);
673 685
686 ret = intel_gvt_workload_req_alloc(workload);
687 if (ret)
688 goto err_req;
689
674 ret = intel_gvt_scan_and_shadow_workload(workload); 690 ret = intel_gvt_scan_and_shadow_workload(workload);
675 if (ret) 691 if (ret)
676 goto out; 692 goto out;
677 693
678 ret = prepare_workload(workload); 694 ret = populate_shadow_context(workload);
695 if (ret) {
696 release_shadow_wa_ctx(&workload->wa_ctx);
697 goto out;
698 }
679 699
700 ret = prepare_workload(workload);
680out: 701out:
681 if (ret)
682 workload->status = ret;
683
684 if (!IS_ERR_OR_NULL(workload->req)) { 702 if (!IS_ERR_OR_NULL(workload->req)) {
685 gvt_dbg_sched("ring id %d submit workload to i915 %p\n", 703 gvt_dbg_sched("ring id %d submit workload to i915 %p\n",
686 ring_id, workload->req); 704 ring_id, workload->req);
687 i915_request_add(workload->req); 705 i915_request_add(workload->req);
688 workload->dispatched = true; 706 workload->dispatched = true;
689 } 707 }
690 708err_req:
709 if (ret)
710 workload->status = ret;
691 mutex_unlock(&dev_priv->drm.struct_mutex); 711 mutex_unlock(&dev_priv->drm.struct_mutex);
692 mutex_unlock(&vgpu->vgpu_lock); 712 mutex_unlock(&vgpu->vgpu_lock);
693 return ret; 713 return ret;
diff --git a/drivers/gpu/drm/i915/gvt/scheduler.h b/drivers/gpu/drm/i915/gvt/scheduler.h
index ca5529d0e48e..2065cba59aab 100644
--- a/drivers/gpu/drm/i915/gvt/scheduler.h
+++ b/drivers/gpu/drm/i915/gvt/scheduler.h
@@ -83,6 +83,7 @@ struct intel_vgpu_workload {
83 struct i915_request *req; 83 struct i915_request *req;
84 /* if this workload has been dispatched to i915? */ 84 /* if this workload has been dispatched to i915? */
85 bool dispatched; 85 bool dispatched;
86 bool shadow; /* if workload has done shadow of guest request */
86 int status; 87 int status;
87 88
88 struct intel_vgpu_mm *shadow_mm; 89 struct intel_vgpu_mm *shadow_mm;