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]>
---
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   | 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

Reply via email to