diff options
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/scheduler.c | 64 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/scheduler.h | 1 |
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 | ||
| 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 | |||
| 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; |
| 433 | err_req: | ||
| 434 | rq = fetch_and_zero(&workload->req); | ||
| 435 | i915_request_put(rq); | ||
| 436 | err_shadow: | 448 | err_shadow: |
| 437 | release_shadow_wa_ctx(&workload->wa_ctx); | 449 | release_shadow_wa_ctx(&workload->wa_ctx); |
| 438 | err_unpin: | 450 | err_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); | ||
| 680 | out: | 701 | out: |
| 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 | 708 | err_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; |
