Skip to content

Commit f0e9943

Browse files
committed
drm/i915/gvt: Fix workload request allocation before request add
In commit 6bb2a2a ("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: 6bb2a2a ("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>
1 parent bfeffd1 commit f0e9943

File tree

2 files changed

+43
-22
lines changed

2 files changed

+43
-22
lines changed

drivers/gpu/drm/i915/gvt/scheduler.c

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,33 @@ static int set_context_ppgtt_from_shadow(struct intel_vgpu_workload *workload,
356356
return 0;
357357
}
358358

359+
static int
360+
intel_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);
382+
out:
383+
return ret;
384+
}
385+
359386
/**
360387
* intel_gvt_scan_and_shadow_workload - audit the workload by scanning and
361388
* 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)
372399
struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv;
373400
struct intel_engine_cs *engine = dev_priv->engine[workload->ring_id];
374401
struct intel_context *ce;
375-
struct i915_request *rq;
376402
int ret;
377403

378404
lockdep_assert_held(&dev_priv->drm.struct_mutex);
379405

380-
if (workload->req)
406+
if (workload->shadow)
381407
return 0;
382408

383409
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)
417443
goto err_shadow;
418444
}
419445

420-
rq = i915_request_alloc(engine, shadow_ctx);
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-
446+
workload->shadow = true;
432447
return 0;
433-
err_req:
434-
rq = fetch_and_zero(&workload->req);
435-
i915_request_put(rq);
436448
err_shadow:
437449
release_shadow_wa_ctx(&workload->wa_ctx);
438450
err_unpin:
@@ -671,23 +683,31 @@ static int dispatch_workload(struct intel_vgpu_workload *workload)
671683
mutex_lock(&vgpu->vgpu_lock);
672684
mutex_lock(&dev_priv->drm.struct_mutex);
673685

686+
ret = intel_gvt_workload_req_alloc(workload);
687+
if (ret)
688+
goto err_req;
689+
674690
ret = intel_gvt_scan_and_shadow_workload(workload);
675691
if (ret)
676692
goto out;
677693

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+
}
679699

700+
ret = prepare_workload(workload);
680701
out:
681-
if (ret)
682-
workload->status = ret;
683-
684702
if (!IS_ERR_OR_NULL(workload->req)) {
685703
gvt_dbg_sched("ring id %d submit workload to i915 %p\n",
686704
ring_id, workload->req);
687705
i915_request_add(workload->req);
688706
workload->dispatched = true;
689707
}
690-
708+
err_req:
709+
if (ret)
710+
workload->status = ret;
691711
mutex_unlock(&dev_priv->drm.struct_mutex);
692712
mutex_unlock(&vgpu->vgpu_lock);
693713
return ret;

drivers/gpu/drm/i915/gvt/scheduler.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ struct intel_vgpu_workload {
8383
struct i915_request *req;
8484
/* if this workload has been dispatched to i915? */
8585
bool dispatched;
86+
bool shadow; /* if workload has done shadow of guest request */
8687
int status;
8788

8889
struct intel_vgpu_mm *shadow_mm;

0 commit comments

Comments
 (0)