On Thu, 24 Apr 2025, Haoxiang Li haoxiang_li2024@163.com wrote:
Add check for the return value of alloc_ordered_workqueue() and alloc_workqueue(). Furthermore, if some allocations fail, cleanup works are added to avoid potential memory leak problem.
Fixes: 40053823baad ("drm/i915/display: move modeset probe/remove functions to intel_display_driver.c") Cc: stable@vger.kernel.org Signed-off-by: Haoxiang Li haoxiang_li2024@163.com
This patch seems to have been neglected, apologies.
I've rebased it and included it as part of a bigger series [1].
Thanks for the patch.
BR, Jani.
[1] https://lore.kernel.org/r/cover.1747397638.git.jani.nikula@intel.com
Changes in v2:
- Split the compound conditional statement into separate conditional statements to facilitate cleanup works.
- Add cleanup works to destory work queues if allocations fail, and modify the later goto destination to do the full excercise.
- modify the patch description. Thanks, Jani!
.../drm/i915/display/intel_display_driver.c | 30 +++++++++++++++---- 1 file changed, 25 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c index 31740a677dd8..ac94561715dc 100644 --- a/drivers/gpu/drm/i915/display/intel_display_driver.c +++ b/drivers/gpu/drm/i915/display/intel_display_driver.c @@ -241,31 +241,45 @@ int intel_display_driver_probe_noirq(struct intel_display *display) intel_dmc_init(display); display->wq.modeset = alloc_ordered_workqueue("i915_modeset", 0);
- if (!display->wq.modeset) {
ret = -ENOMEM;
goto cleanup_vga_client_pw_domain_dmc;
- }
- display->wq.flip = alloc_workqueue("i915_flip", WQ_HIGHPRI | WQ_UNBOUND, WQ_UNBOUND_MAX_ACTIVE);
- if (!display->wq.flip) {
ret = -ENOMEM;
goto cleanup_wq_modeset;
- }
- display->wq.cleanup = alloc_workqueue("i915_cleanup", WQ_HIGHPRI, 0);
- if (!display->wq.cleanup) {
ret = -ENOMEM;
goto cleanup_wq_flip;
- }
intel_mode_config_init(display); ret = intel_cdclk_init(display); if (ret)
goto cleanup_vga_client_pw_domain_dmc;
goto cleanup_wq_cleanup;
ret = intel_color_init(display); if (ret)
goto cleanup_vga_client_pw_domain_dmc;
goto cleanup_wq_cleanup;
ret = intel_dbuf_init(i915); if (ret)
goto cleanup_vga_client_pw_domain_dmc;
goto cleanup_wq_cleanup;
ret = intel_bw_init(i915); if (ret)
goto cleanup_vga_client_pw_domain_dmc;
goto cleanup_wq_cleanup;
ret = intel_pmdemand_init(display); if (ret)
goto cleanup_vga_client_pw_domain_dmc;
goto cleanup_wq_cleanup;
intel_init_quirks(display); @@ -273,6 +287,12 @@ int intel_display_driver_probe_noirq(struct intel_display *display) return 0; +cleanup_wq_cleanup:
- destroy_workqueue(display->wq.cleanup);
+cleanup_wq_flip:
- destroy_workqueue(display->wq.flip);
+cleanup_wq_modeset:
- destroy_workqueue(display->wq.modeset);
cleanup_vga_client_pw_domain_dmc: intel_dmc_fini(display); intel_power_domains_driver_remove(display);