drm/i915: Intruduce display.wq.cleanup
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Wed, 27 Nov 2024 06:11:15 +0000 (08:11 +0200)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Thu, 28 Nov 2024 15:33:40 +0000 (17:33 +0200)
Introduce a dedicated workqueue for the commit cleanup work.
In the future we'll need this to guarantee all the cleanup
works have finished at a specific point during suspend.

Cc: Brian Geffon <bgeffon@google.com>
Cc: Vidya Srinivas <vidya.srinivas@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241127061117.25622-3-ville.syrjala@linux.intel.com
Reviewed-by: Vidya Srinivas <vidya.srinivas@intel.com>
Tested-by: Vidya Srinivas <vidya.srinivas@intel.com>
drivers/gpu/drm/i915/display/intel_display.c
drivers/gpu/drm/i915/display/intel_display_core.h
drivers/gpu/drm/i915/display/intel_display_driver.c

index 5260f6eafaf85e6f51a02f05704e948d885bc724..4805bf682d436fadb33338c4f4e71657d42a10c5 100644 (file)
@@ -7937,7 +7937,7 @@ static void intel_atomic_commit_tail(struct intel_atomic_state *state)
         * down.
         */
        INIT_WORK(&state->cleanup_work, intel_atomic_cleanup_work);
-       queue_work(system_highpri_wq, &state->cleanup_work);
+       queue_work(dev_priv->display.wq.cleanup, &state->cleanup_work);
 }
 
 static void intel_atomic_commit_work(struct work_struct *work)
index 62b0597aa91e39acbd2245af6d297a6f23f352d4..554870d2494b31f5c3763275f3f1b4becfb0e5b7 100644 (file)
@@ -554,6 +554,9 @@ struct intel_display {
 
                /* unbound hipri wq for page flips/plane updates */
                struct workqueue_struct *flip;
+
+               /* hipri wq for commit cleanups */
+               struct workqueue_struct *cleanup;
        } wq;
 
        /* Grouping using named structs. Keep sorted. */
index 84fbaab50991cdcac803ec9e5795bd4c446cacac..edab1dd082d845837142350f06a798daa340855a 100644 (file)
@@ -242,6 +242,7 @@ int intel_display_driver_probe_noirq(struct drm_i915_private *i915)
        i915->display.wq.modeset = alloc_ordered_workqueue("i915_modeset", 0);
        i915->display.wq.flip = alloc_workqueue("i915_flip", WQ_HIGHPRI |
                                                WQ_UNBOUND, WQ_UNBOUND_MAX_ACTIVE);
+       i915->display.wq.cleanup = alloc_workqueue("i915_cleanup", WQ_HIGHPRI, 0);
 
        intel_mode_config_init(i915);
 
@@ -571,6 +572,7 @@ void intel_display_driver_remove(struct drm_i915_private *i915)
 
        flush_workqueue(i915->display.wq.flip);
        flush_workqueue(i915->display.wq.modeset);
+       flush_workqueue(i915->display.wq.cleanup);
 
        /*
         * MST topology needs to be suspended so we don't have any calls to
@@ -613,6 +615,7 @@ void intel_display_driver_remove_noirq(struct drm_i915_private *i915)
 
        destroy_workqueue(i915->display.wq.flip);
        destroy_workqueue(i915->display.wq.modeset);
+       destroy_workqueue(i915->display.wq.cleanup);
 
        intel_fbc_cleanup(&i915->display);
 }