[PATCH v2] drm/i915/display: fix error handling in intel_display_driver_probe_noirq

From: yaolu

Date: Tue Jun 30 2026 - 21:15:52 EST


From: Lu Yao <yaolu@xxxxxxxxxx>

Fix two bugs in the probe error path:

1. If intel_mode_config_init() succeeded, after intel_xxx_init()
failed leaked the resources allocated by drm_mode_config_init().
Add a cleanup_mode_config label.

2. intel_dmc_fini() was called on workqueue alloc failed paths but
intel_dmc_init() don't been invoked. Move the dmc fini call in
cleanup_mode_config label.

Signed-off-by: Lu Yao <yaolu@xxxxxxxxxx>
---
v1->v2: don't move intel_dmc_init() advance
chencked by Sashiko AI and Jani
Link: https://lore.kernel.org/all/20260630032254.05B511F000E9@xxxxxxxxxxxxxxx/
Link: https://lore.kernel.org/all/677fb92771df1f9f491226bf006c157a007c16dc@xxxxxxxxx/

.../drm/i915/display/intel_display_driver.c | 20 ++++++++++---------
1 file changed, 11 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
index d0729936f681..01770847fbdf 100644
--- a/drivers/gpu/drm/i915/display/intel_display_driver.c
+++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
@@ -226,7 +226,7 @@ int intel_display_driver_probe_noirq(struct intel_display *display)
display->hotplug.dp_wq = alloc_ordered_workqueue("intel-dp", 0);
if (!display->hotplug.dp_wq) {
ret = -ENOMEM;
- goto cleanup_pw_domain_dmc;
+ goto cleanup_pw_domain;
}

display->wq.modeset = alloc_ordered_workqueue("i915_modeset", 0);
@@ -260,27 +260,27 @@ int intel_display_driver_probe_noirq(struct intel_display *display)

ret = intel_cdclk_init(display);
if (ret)
- goto cleanup_wq_unordered;
+ goto cleanup_mode_config;

ret = intel_color_init(display);
if (ret)
- goto cleanup_wq_unordered;
+ goto cleanup_mode_config;

ret = intel_dbuf_init(display);
if (ret)
- goto cleanup_wq_unordered;
+ goto cleanup_mode_config;

ret = intel_dbuf_bw_init(display);
if (ret)
- goto cleanup_wq_unordered;
+ goto cleanup_mode_config;

ret = intel_bw_init(display);
if (ret)
- goto cleanup_wq_unordered;
+ goto cleanup_mode_config;

ret = intel_pmdemand_init(display);
if (ret)
- goto cleanup_wq_unordered;
+ goto cleanup_mode_config;

intel_init_quirks(display);

@@ -288,6 +288,9 @@ int intel_display_driver_probe_noirq(struct intel_display *display)

return 0;

+cleanup_mode_config:
+ intel_mode_config_cleanup(display);
+ intel_dmc_fini(display);
cleanup_wq_unordered:
destroy_workqueue(display->wq.unordered);
cleanup_wq_cleanup:
@@ -298,8 +301,7 @@ int intel_display_driver_probe_noirq(struct intel_display *display)
destroy_workqueue(display->wq.modeset);
cleanup_wq_dp:
destroy_workqueue(display->hotplug.dp_wq);
-cleanup_pw_domain_dmc:
- intel_dmc_fini(display);
+cleanup_pw_domain:
intel_display_power_driver_remove(display);
cleanup_bios:
intel_bios_driver_remove(display);
--
2.25.1