summaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorZhenyu Wang <zhenyuw@linux.intel.com>2018-12-28 22:13:10 -0500
committerZhenyu Wang <zhenyuw@linux.intel.com>2019-01-08 23:59:09 -0500
commitf0e9943725186ddbdc9718a559c26c5f507262f2 (patch)
treee10afabea19ecd5a56101cb7dbfc9395236a9754 /drivers/gpu
parentbfeffd155283772bbe78c6a05dec7c0128ee500c (diff)
drm/i915/gvt: Fix workload request allocation before request add
In commit 6bb2a2af8b1b ("drm/i915/gvt: Fix crash after request->hw_context change"), forgot to handle workload scan path in ELSP handler case which was to optimize scanning earlier instead of in gvt submission thread, so request alloc and add was splitting then which is against right process. This trys to do a partial revert of that commit which still has workload request alloc helper and make sure shadow state population is handled after request alloc for target state buffer. v3: Fix missed workload status setting in request alloc error path v2: Fix dispatch workload err path that should add request after alloc anyway. Fixes: 6bb2a2af8b1b ("drm/i915/gvt: Fix crash after request->hw_context change") Cc: Bin Yang <bin.yang@intel.com> Cc: Chris Wilson <chris@chris-wilson.co.uk> Tested-by: Bin Yang <bin.yang@intel.com> Reviewed-by: Xiaolin Zhang <xiaolin.zhang@intel.com> Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
Diffstat (limited to 'drivers/gpu')
-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;