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 <[email protected]>
---
 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

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to