]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
drm/i915: Use a high priority wq for nonblocking plane updates
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Tue, 10 Sep 2019 12:13:47 +0000 (15:13 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Wed, 11 Sep 2019 13:58:53 +0000 (16:58 +0300)
system_unbound_wq can't keep up sometimes and we get dropped frames.
Switch to a high priority variant.

Reported-by: Heinrich Fink <heinrich.fink@daqri.com>
Tested-by: Heinrich Fink <heinrich.fink@daqri.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190910121347.22958-1-ville.syrjala@linux.intel.com
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
drivers/gpu/drm/i915/display/intel_display.c
drivers/gpu/drm/i915/i915_drv.h

index 3b5275ab66cf0752642f86921c6df087c239545d..2668744007b35a0cc76049da405be1c11a57e70e 100644 (file)
@@ -14272,7 +14272,7 @@ static int intel_atomic_commit(struct drm_device *dev,
        if (nonblock && state->modeset) {
                queue_work(dev_priv->modeset_wq, &state->base.commit_work);
        } else if (nonblock) {
-               queue_work(system_unbound_wq, &state->base.commit_work);
+               queue_work(dev_priv->flip_wq, &state->base.commit_work);
        } else {
                if (state->modeset)
                        flush_workqueue(dev_priv->modeset_wq);
@@ -16181,6 +16181,8 @@ int intel_modeset_init(struct drm_device *dev)
        int ret;
 
        dev_priv->modeset_wq = alloc_ordered_workqueue("i915_modeset", 0);
+       dev_priv->flip_wq = alloc_workqueue("i915_flip", WQ_HIGHPRI |
+                                           WQ_UNBOUND, WQ_UNBOUND_MAX_ACTIVE);
 
        drm_mode_config_init(dev);
 
@@ -17139,6 +17141,7 @@ void intel_modeset_driver_remove(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = to_i915(dev);
 
+       flush_workqueue(dev_priv->flip_wq);
        flush_workqueue(dev_priv->modeset_wq);
 
        flush_work(&dev_priv->atomic_helper.free_work);
@@ -17175,6 +17178,7 @@ void intel_modeset_driver_remove(struct drm_device *dev)
 
        intel_gmbus_teardown(dev_priv);
 
+       destroy_workqueue(dev_priv->flip_wq);
        destroy_workqueue(dev_priv->modeset_wq);
 
        intel_fbc_cleanup_cfb(dev_priv);
index 51d575cca2ac33adf63192af5450f700f5285402..2ea11123e933e86aa2e1b3df449f9b268156ed7a 100644 (file)
@@ -1438,6 +1438,8 @@ struct drm_i915_private {
 
        /* ordered wq for modesets */
        struct workqueue_struct *modeset_wq;
+       /* unbound hipri wq for page flips/plane updates */
+       struct workqueue_struct *flip_wq;
 
        /* Display functions */
        struct drm_i915_display_funcs display;