From: Lu Yao <[email protected]>

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 <[email protected]>
---
v2->v3: rm unused label checked by CI
  Link: 
https://lore.kernel.org/all/178294904225.140838.18311548714090230092@6beec6c84f66/

v1->v2: don't move intel_dmc_init() advance chencked by Sashiko AI and Jani
  Link: https://lore.kernel.org/all/[email protected]/
  Link: 
https://lore.kernel.org/all/[email protected]/

 .../drm/i915/display/intel_display_driver.c   | 21 ++++++++++---------
 1 file changed, 11 insertions(+), 10 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..4af2324f5252 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,7 +288,9 @@ int intel_display_driver_probe_noirq(struct intel_display 
*display)
 
        return 0;
 
-cleanup_wq_unordered:
+cleanup_mode_config:
+       intel_mode_config_cleanup(display);
+       intel_dmc_fini(display);
        destroy_workqueue(display->wq.unordered);
 cleanup_wq_cleanup:
        destroy_workqueue(display->wq.cleanup);
@@ -298,8 +300,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

Reply via email to