| From b13a6e382e9b4709deaa5b68e9a010287b86cc65 Mon Sep 17 00:00:00 2001 |
| From: Zhenyu Wang <zhenyuw@linux.intel.com> |
| Date: Tue, 3 Mar 2020 13:54:12 +0800 |
| Subject: [PATCH] drm/i915/gvt: Fix unnecessary schedule timer when no vGPU |
| exits |
| |
| commit 04d6067f1f19e70a418f92fa3170cf7fe53b7fdf upstream. |
| |
| From commit f25a49ab8ab9 ("drm/i915/gvt: Use vgpu_lock to protect per |
| vgpu access") the vgpu idr destroy is moved later than vgpu resource |
| destroy, then it would fail to stop timer for schedule policy clean |
| which to check vgpu idr for any left vGPU. So this trys to destroy |
| vgpu idr earlier. |
| |
| Cc: Colin Xu <colin.xu@intel.com> |
| Fixes: f25a49ab8ab9 ("drm/i915/gvt: Use vgpu_lock to protect per vgpu access") |
| Acked-by: Colin Xu <colin.xu@intel.com> |
| Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com> |
| Link: http://patchwork.freedesktop.org/patch/msgid/20200229055445.31481-1-zhenyuw@linux.intel.com |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/gpu/drm/i915/gvt/vgpu.c b/drivers/gpu/drm/i915/gvt/vgpu.c |
| index a265a2e9a573..e9e9547ffb1e 100644 |
| --- a/drivers/gpu/drm/i915/gvt/vgpu.c |
| +++ b/drivers/gpu/drm/i915/gvt/vgpu.c |
| @@ -272,10 +272,17 @@ void intel_gvt_destroy_vgpu(struct intel_vgpu *vgpu) |
| { |
| struct intel_gvt *gvt = vgpu->gvt; |
| |
| - mutex_lock(&vgpu->vgpu_lock); |
| - |
| WARN(vgpu->active, "vGPU is still active!\n"); |
| |
| + /* |
| + * remove idr first so later clean can judge if need to stop |
| + * service if no active vgpu. |
| + */ |
| + mutex_lock(&gvt->lock); |
| + idr_remove(&gvt->vgpu_idr, vgpu->id); |
| + mutex_unlock(&gvt->lock); |
| + |
| + mutex_lock(&vgpu->vgpu_lock); |
| intel_gvt_debugfs_remove_vgpu(vgpu); |
| intel_vgpu_clean_sched_policy(vgpu); |
| intel_vgpu_clean_submission(vgpu); |
| @@ -290,7 +297,6 @@ void intel_gvt_destroy_vgpu(struct intel_vgpu *vgpu) |
| mutex_unlock(&vgpu->vgpu_lock); |
| |
| mutex_lock(&gvt->lock); |
| - idr_remove(&gvt->vgpu_idr, vgpu->id); |
| if (idr_is_empty(&gvt->vgpu_idr)) |
| intel_gvt_clean_irq(gvt); |
| intel_gvt_update_vgpu_types(gvt); |
| -- |
| 2.7.4 |
| |