[Intel-gfx] [PATCH 2/2] drm/i915/gvt: Stop waiting whilst holding struct_mutex
Chris Wilson
chris at chris-wilson.co.uk
Wed Oct 19 08:12:28 UTC 2016
For whatever reason, the gvt scheduler runs synchronously. At the very
least, lets run synchronously without holding the struct_mutex.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
drivers/gpu/drm/i915/gvt/scheduler.c | 13 ++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)
diff --git a/drivers/gpu/drm/i915/gvt/scheduler.c b/drivers/gpu/drm/i915/gvt/scheduler.c
index 4cedd3274da7..aa83dd3381a3 100644
--- a/drivers/gpu/drm/i915/gvt/scheduler.c
+++ b/drivers/gpu/drm/i915/gvt/scheduler.c
@@ -420,10 +420,6 @@ static int workload_thread(void *priv)
intel_runtime_pm_get(gvt->dev_priv);
- /*
- * Always take i915 big lock first
- */
- mutex_lock(&gvt->dev_priv->drm.struct_mutex);
gvt_dbg_sched("ring id %d will dispatch workload %p\n",
workload->ring_id, workload);
@@ -432,7 +428,10 @@ static int workload_thread(void *priv)
intel_uncore_forcewake_get(gvt->dev_priv,
FORCEWAKE_ALL);
+ mutex_lock(&gvt->dev_priv->drm.struct_mutex);
ret = dispatch_workload(workload);
+ mutex_lock(&gvt->dev_priv->drm.struct_mutex);
+
if (ret) {
gvt_err("fail to dispatch workload, skip\n");
goto complete;
@@ -442,8 +441,7 @@ static int workload_thread(void *priv)
workload->ring_id, workload);
workload->status = i915_wait_request(workload->req,
- I915_WAIT_LOCKED,
- NULL, NULL);
+ 0, NULL, NULL);
if (workload->status != 0)
gvt_err("fail to wait workload, skip\n");
@@ -451,13 +449,14 @@ static int workload_thread(void *priv)
gvt_dbg_sched("will complete workload %p\n, status: %d\n",
workload, workload->status);
+ mutex_lock(&gvt->dev_priv->drm.struct_mutex);
complete_current_workload(gvt, ring_id);
+ mutex_unlock(&gvt->dev_priv->drm.struct_mutex);
if (need_force_wake)
intel_uncore_forcewake_put(gvt->dev_priv,
FORCEWAKE_ALL);
- mutex_unlock(&gvt->dev_priv->drm.struct_mutex);
intel_runtime_pm_put(gvt->dev_priv);
}
--
2.9.3
More information about the Intel-gfx
mailing list