[Intel-gfx] [PATCH] drm/i915: Queue page flip work with high priority

Tvrtko Ursulin tvrtko.ursulin at linux.intel.com
Tue Sep 13 10:24:52 UTC 2016


On 12/09/16 15:09, Imre Deak wrote:
> While user space has control over the scheduling priority of its page
> flipping thread, the corresponding work the driver schedules for MMIO
> flips always runs with normal scheduling priority. This would hinder an
> application that wants more stringent guarantees over flip timing (to
> avoid missing a flip at the next frame count).
>
> Fix this by scheduling the work with high priority, meaning normal
> scheduling policy with -20 nice level.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97775
> Testcase: igt/kms_cursor_legacy
> CC: Chris Wilson <chris at chris-wilson.co.uk>
> CC: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
> Signed-off-by: Imre Deak <imre.deak at intel.com>
> ---
>   drivers/gpu/drm/i915/i915_drv.c      | 7 +++++++
>   drivers/gpu/drm/i915/i915_drv.h      | 4 ++++
>   drivers/gpu/drm/i915/intel_display.c | 2 +-
>   3 files changed, 12 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
> index 02c34d6..381ef23 100644
> --- a/drivers/gpu/drm/i915/i915_drv.c
> +++ b/drivers/gpu/drm/i915/i915_drv.c
> @@ -756,8 +756,14 @@ static int i915_workqueues_init(struct drm_i915_private *dev_priv)
>   	if (dev_priv->hotplug.dp_wq == NULL)
>   		goto out_free_wq;
>
> +	dev_priv->flip_wq = alloc_workqueue("i915-flip", WQ_HIGHPRI, 0);
> +	if (dev_priv->flip_wq == NULL)
> +		goto out_free_dp_wq;
> +
>   	return 0;
>
> +out_free_dp_wq:
> +	destroy_workqueue(dev_priv->hotplug.dp_wq);
>   out_free_wq:
>   	destroy_workqueue(dev_priv->wq);
>   out_err:
> @@ -768,6 +774,7 @@ out_err:
>
>   static void i915_workqueues_cleanup(struct drm_i915_private *dev_priv)
>   {
> +	destroy_workqueue(dev_priv->flip_wq);
>   	destroy_workqueue(dev_priv->hotplug.dp_wq);
>   	destroy_workqueue(dev_priv->wq);
>   }
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index f499fa5..3653ce4 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -1844,6 +1844,10 @@ struct drm_i915_private {
>   	 * result in deadlocks.
>   	 */
>   	struct workqueue_struct *wq;
> +	/**
> +	 * flip_wq - High priority flip workqueue.
> +	 */
> +	struct workqueue_struct *flip_wq;
>
>   	/* Display functions */
>   	struct drm_i915_display_funcs display;
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index 3c367d0..48433e1 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -12278,7 +12278,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
>
>   		work->flip_queued_req = i915_gem_active_get(&obj->last_write,
>   							    &obj->base.dev->struct_mutex);
> -		schedule_work(&work->mmio_work);
> +		queue_work(dev_priv->flip_wq, &work->mmio_work);
>   	} else {
>   		request = i915_gem_request_alloc(engine, engine->last_context);
>   		if (IS_ERR(request)) {
>

I am curious if just a dedicated wq would be enough, or you have found 
that it has to be a high-prio one?

Otherwise patch looks fine to me.

Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>

Regards,

Tvrtko





More information about the Intel-gfx mailing list