Commit b240f792ae02 for kernel

commit b240f792ae02e9b687eafff934a39e57d1e45365
Author: Guangshuo Li <lgs201920130244@gmail.com>
Date:   Wed Jul 8 18:51:15 2026 +0800

    drm/amdkfd: free MQD managers on DQM init failures

    The change referenced by the Fixes tag releases the HIQ SDMA MQD trunk
    buffer when device_queue_manager_init() fails after it has been
    allocated.

    However, the same failure path can also be reached after
    init_mqd_managers() has succeeded. At that point dqm->mqd_mgrs[] contains
    per-type MQD manager objects owned by the device queue manager. The
    normal teardown path frees those objects from uninitialize(), but the
    initialization error path only frees dqm itself.

    Free the MQD managers from the initialization error path as well. This is
    safe for earlier failures because dqm is zeroed when allocated and
    init_mqd_managers() clears the entries it rolls back internally.

    Fixes: b7cccc8286bb ("drm/amdkfd: fix a memory leak in device_queue_manager_init()")
    Signed-off-by: Guangshuo Li <lgs201920130244@gmail.com>
    Reviewed-by: Mukul Joshi <mukul.joshi@amd.com>
    Reviewed-by: Felix Kuehling <felix.kuehling@amd.com>
    Signed-off-by: Felix Kuehling <felix.kuehling@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    (cherry picked from commit 1fff2e07b6670bc5b8f7344a8708c136259cb176)
    Cc: stable@vger.kernel.org

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
index 678ec611a4f2..67137679a901 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
@@ -3103,6 +3103,7 @@ static void deallocate_hiq_sdma_mqd(struct kfd_node *dev,
 struct device_queue_manager *device_queue_manager_init(struct kfd_node *dev)
 {
 	struct device_queue_manager *dqm;
+	int i;

 	pr_debug("Loading device queue manager\n");

@@ -3231,6 +3232,9 @@ struct device_queue_manager *device_queue_manager_init(struct kfd_node *dev)
 		deallocate_hiq_sdma_mqd(dev, &dqm->hiq_sdma_mqd);

 out_free:
+	for (i = 0; i < KFD_MQD_TYPE_MAX; i++)
+		kfree(dqm->mqd_mgrs[i]);
+
 	kfree(dqm);
 	return NULL;
 }