On 2016.10.19 10:14:39 +0100, Chris Wilson wrote: > For whatever reason, the gvt scheduler runs synchronously. At the very > least, lets run synchronously without holding the struct_mutex. > > v2: cut'n'paste mutex_lock instead of unlock. > Replace long hold of struct_mutex with a mutex to serialise the worker > threads. > > Signed-off-by: Chris Wilson <[email protected]>
This looks ok to me, but let me test it with VM first to ensure
the behavior is expected.
Thanks
> ---
> drivers/gpu/drm/i915/gvt/scheduler.c | 22 +++++++++++++---------
> 1 file changed, 13 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gvt/scheduler.c
> b/drivers/gpu/drm/i915/gvt/scheduler.c
> index 4cedd3274da7..55f8ed7d7be5 100644
> --- a/drivers/gpu/drm/i915/gvt/scheduler.c
> +++ b/drivers/gpu/drm/i915/gvt/scheduler.c
> @@ -390,6 +390,8 @@ struct workload_thread_param {
> int ring_id;
> };
>
> +static DEFINE_MUTEX(scheduler_mutex);
> +
> static int workload_thread(void *priv)
> {
> struct workload_thread_param *p = (struct workload_thread_param *)priv;
> @@ -414,17 +416,14 @@ static int workload_thread(void *priv)
> if (kthread_should_stop())
> break;
>
> + mutex_lock(&scheduler_mutex);
> +
> gvt_dbg_sched("ring id %d next workload %p vgpu %d\n",
> workload->ring_id, workload,
> workload->vgpu->id);
>
> 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 +431,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_unlock(&gvt->dev_priv->drm.struct_mutex);
> +
> if (ret) {
> gvt_err("fail to dispatch workload, skip\n");
> goto complete;
> @@ -442,8 +444,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,15 +452,18 @@ 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);
> +
> + mutex_unlock(&scheduler_mutex);
> +
> }
> return 0;
> }
> --
> 2.9.3
>
> _______________________________________________
> Intel-gfx mailing list
> [email protected]
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Open Source Technology Center, Intel ltd.
$gpg --keyserver wwwkeys.pgp.net --recv-keys 4D781827
signature.asc
Description: PGP signature
_______________________________________________ Intel-gfx mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/intel-gfx
