From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Liu Xinyun Date: Sat, 12 Oct 2019 03:26:12 +0800 Subject: [PATCH] drm/i915/gvt: Add parameter to disable non-context reg save/restore When guest OS is Linux too, the non-context regs save/restore can be bypassed to save time while doing GPU context switch set `enable_context_restore` to false as the default value for Acrn Tracked-On: projectacrn/acrn-hypervisor#3830 Signed-off-by: Liu Xinyun Reviewed-by: Zhao Yakui --- drivers/gpu/drm/i915/gvt/sched_policy.c | 6 ++++++ drivers/gpu/drm/i915/gvt/scheduler.c | 15 +++++++++++++-- drivers/gpu/drm/i915/i915_params.c | 3 +++ drivers/gpu/drm/i915/i915_params.h | 3 ++- 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/i915/gvt/sched_policy.c b/drivers/gpu/drm/i915/gvt/sched_policy.c index c32e7d5e8629..594070bcd7c1 100644 --- a/drivers/gpu/drm/i915/gvt/sched_policy.c +++ b/drivers/gpu/drm/i915/gvt/sched_policy.c @@ -465,6 +465,11 @@ void intel_vgpu_stop_schedule(struct intel_vgpu *vgpu) scheduler->current_vgpu = NULL; } + if (!i915_modparams.enable_context_restore) { + mutex_unlock(&vgpu->gvt->sched_lock); + return; + } + intel_runtime_pm_get(dev_priv); spin_lock_bh(&scheduler->mmio_context_lock); for (ring_id = 0; ring_id < I915_NUM_ENGINES; ring_id++) { @@ -475,5 +480,6 @@ void intel_vgpu_stop_schedule(struct intel_vgpu *vgpu) } spin_unlock_bh(&scheduler->mmio_context_lock); intel_runtime_pm_put(dev_priv); + mutex_unlock(&vgpu->gvt->sched_lock); } diff --git a/drivers/gpu/drm/i915/gvt/scheduler.c b/drivers/gpu/drm/i915/gvt/scheduler.c index 52df3600b835..0dd1815ee772 100644 --- a/drivers/gpu/drm/i915/gvt/scheduler.c +++ b/drivers/gpu/drm/i915/gvt/scheduler.c @@ -292,6 +292,9 @@ static int shadow_context_status_change(struct notifier_block *nb, unsigned long flags; if (!is_gvt_request(req)) { + if (!i915_modparams.enable_context_restore) + return NOTIFY_OK; + spin_lock_irqsave(&scheduler->mmio_context_lock, flags); if (action == INTEL_CONTEXT_SCHEDULE_IN && scheduler->engine_owner[ring_id]) { @@ -311,6 +314,12 @@ static int shadow_context_status_change(struct notifier_block *nb, switch (action) { case INTEL_CONTEXT_SCHEDULE_IN: + if (!i915_modparams.enable_context_restore) { + schedule_work(&gvt->active_hp_work); + atomic_set(&workload->shadow_ctx_active, 1); + break; + } + spin_lock_irqsave(&scheduler->mmio_context_lock, flags); if (workload->vgpu != scheduler->engine_owner[ring_id]) { /* Switch ring from host to vGPU or vGPU to vGPU. */ @@ -326,11 +335,13 @@ static int shadow_context_status_change(struct notifier_block *nb, atomic_set(&workload->shadow_ctx_active, 1); break; case INTEL_CONTEXT_SCHEDULE_OUT: - save_ring_hw_state(workload->vgpu, ring_id); + if (i915_modparams.enable_context_restore) + save_ring_hw_state(workload->vgpu, ring_id); atomic_set(&workload->shadow_ctx_active, 0); break; case INTEL_CONTEXT_SCHEDULE_PREEMPTED: - save_ring_hw_state(workload->vgpu, ring_id); + if (i915_modparams.enable_context_restore) + save_ring_hw_state(workload->vgpu, ring_id); break; default: WARN_ON(1); diff --git a/drivers/gpu/drm/i915/i915_params.c b/drivers/gpu/drm/i915/i915_params.c index 308dba99c973..60ec862d2e36 100644 --- a/drivers/gpu/drm/i915/i915_params.c +++ b/drivers/gpu/drm/i915/i915_params.c @@ -258,6 +258,9 @@ i915_param_named_unsafe(domain_plane_owners, ullong, 0400, planes owner: 3C:2 2C:2 1C:1 4B:1 3B:1 2B:1 1B:0 4A:0 3A:0 2A:1 1A:0 \ (0x0 - default value)"); +i915_param_named_unsafe(enable_context_restore, bool, 0400, + "To togger non-context regs save/restore feature(default:false)"); + static __always_inline void _print_param(struct drm_printer *p, const char *name, const char *type, diff --git a/drivers/gpu/drm/i915/i915_params.h b/drivers/gpu/drm/i915/i915_params.h index 1fbdfd9b8703..61d863ffa9d0 100644 --- a/drivers/gpu/drm/i915/i915_params.h +++ b/drivers/gpu/drm/i915/i915_params.h @@ -77,7 +77,8 @@ struct drm_printer; | PVMMIO_GGTT_UPDATE ) \ param(int, gvt_workload_priority, 0) \ param(bool, enable_initial_modeset, false) \ - param(bool, enable_gvt, false) + param(bool, enable_gvt, false) \ + param(bool, enable_context_restore, false) #define MEMBER(T, member, ...) T member; struct i915_params { -- https://clearlinux.org