* [PATCH] drm/amdkfd: fix a memory leak in device_queue_manager_init()
@ 2026-01-04 13:15 Haoxiang Li
2026-01-04 22:41 ` kernel test robot
2026-01-05 18:59 ` Kuehling, Felix
0 siblings, 2 replies; 3+ messages in thread
From: Haoxiang Li @ 2026-01-04 13:15 UTC (permalink / raw)
To: Felix.Kuehling, alexander.deucher, christian.koenig, airlied, simona
Cc: amd-gfx, dri-devel, linux-kernel, Haoxiang Li
If dqm->ops.initialize() fails, add deallocate_hiq_sdma_mqd()
to release the memory allocated by allocate_hiq_sdma_mqd().
Signed-off-by: Haoxiang Li <lihaoxiang@isrc.iscas.ac.cn>
---
drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | 3 +++
1 file changed, 3 insertions(+)
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 d7a2e7178ea9..58a8d90c1533 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
@@ -3042,6 +3042,9 @@ struct device_queue_manager *device_queue_manager_init(struct kfd_node *dev)
return dqm;
}
+ if (!dev->kfd->shared_resources.enable_mes)
+ deallocate_hiq_sdma_mqd(dev, &dqm->hiq_sdma_mqd);
+
out_free:
kfree(dqm);
return NULL;
--
2.25.1
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] drm/amdkfd: fix a memory leak in device_queue_manager_init()
2026-01-04 13:15 [PATCH] drm/amdkfd: fix a memory leak in device_queue_manager_init() Haoxiang Li
@ 2026-01-04 22:41 ` kernel test robot
2026-01-05 18:59 ` Kuehling, Felix
1 sibling, 0 replies; 3+ messages in thread
From: kernel test robot @ 2026-01-04 22:41 UTC (permalink / raw)
To: Haoxiang Li, Felix.Kuehling, alexander.deucher, christian.koenig,
airlied, simona
Cc: oe-kbuild-all, amd-gfx, dri-devel, linux-kernel, Haoxiang Li
Hi Haoxiang,
kernel test robot noticed the following build errors:
[auto build test ERROR on drm-misc/drm-misc-next]
[also build test ERROR on linus/master v6.19-rc3 next-20251219]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Haoxiang-Li/drm-amdkfd-fix-a-memory-leak-in-device_queue_manager_init/20260104-211645
base: https://gitlab.freedesktop.org/drm/misc/kernel.git drm-misc-next
patch link: https://lore.kernel.org/r/20260104131532.3978895-1-lihaoxiang%40isrc.iscas.ac.cn
patch subject: [PATCH] drm/amdkfd: fix a memory leak in device_queue_manager_init()
config: x86_64-rhel-9.4-ltp (https://download.01.org/0day-ci/archive/20260104/202601042317.3h1kg7NS-lkp@intel.com/config)
compiler: gcc-14 (Debian 14.2.0-19) 14.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260104/202601042317.3h1kg7NS-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202601042317.3h1kg7NS-lkp@intel.com/
All error/warnings (new ones prefixed by >>):
drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_device_queue_manager.c: In function 'device_queue_manager_init':
>> drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_device_queue_manager.c:3046:17: error: implicit declaration of function 'deallocate_hiq_sdma_mqd'; did you mean 'allocate_hiq_sdma_mqd'? [-Wimplicit-function-declaration]
3046 | deallocate_hiq_sdma_mqd(dev, &dqm->hiq_sdma_mqd);
| ^~~~~~~~~~~~~~~~~~~~~~~
| allocate_hiq_sdma_mqd
drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_device_queue_manager.c: At top level:
>> drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_device_queue_manager.c:3053:13: warning: conflicting types for 'deallocate_hiq_sdma_mqd'; have 'void(struct kfd_node *, struct kfd_mem_obj *)'
3053 | static void deallocate_hiq_sdma_mqd(struct kfd_node *dev,
| ^~~~~~~~~~~~~~~~~~~~~~~
>> drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_device_queue_manager.c:3053:13: error: static declaration of 'deallocate_hiq_sdma_mqd' follows non-static declaration
drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_device_queue_manager.c:3046:17: note: previous implicit declaration of 'deallocate_hiq_sdma_mqd' with type 'void(struct kfd_node *, struct kfd_mem_obj *)'
3046 | deallocate_hiq_sdma_mqd(dev, &dqm->hiq_sdma_mqd);
| ^~~~~~~~~~~~~~~~~~~~~~~
vim +3046 drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_device_queue_manager.c
2921
2922 struct device_queue_manager *device_queue_manager_init(struct kfd_node *dev)
2923 {
2924 struct device_queue_manager *dqm;
2925
2926 pr_debug("Loading device queue manager\n");
2927
2928 dqm = kzalloc(sizeof(*dqm), GFP_KERNEL);
2929 if (!dqm)
2930 return NULL;
2931
2932 switch (dev->adev->asic_type) {
2933 /* HWS is not available on Hawaii. */
2934 case CHIP_HAWAII:
2935 /* HWS depends on CWSR for timely dequeue. CWSR is not
2936 * available on Tonga.
2937 *
2938 * FIXME: This argument also applies to Kaveri.
2939 */
2940 case CHIP_TONGA:
2941 dqm->sched_policy = KFD_SCHED_POLICY_NO_HWS;
2942 break;
2943 default:
2944 dqm->sched_policy = sched_policy;
2945 break;
2946 }
2947
2948 dqm->dev = dev;
2949 switch (dqm->sched_policy) {
2950 case KFD_SCHED_POLICY_HWS:
2951 case KFD_SCHED_POLICY_HWS_NO_OVERSUBSCRIPTION:
2952 /* initialize dqm for cp scheduling */
2953 dqm->ops.create_queue = create_queue_cpsch;
2954 dqm->ops.initialize = initialize_cpsch;
2955 dqm->ops.start = start_cpsch;
2956 dqm->ops.stop = stop_cpsch;
2957 dqm->ops.halt = halt_cpsch;
2958 dqm->ops.unhalt = unhalt_cpsch;
2959 dqm->ops.destroy_queue = destroy_queue_cpsch;
2960 dqm->ops.update_queue = update_queue;
2961 dqm->ops.register_process = register_process;
2962 dqm->ops.unregister_process = unregister_process;
2963 dqm->ops.uninitialize = uninitialize;
2964 dqm->ops.create_kernel_queue = create_kernel_queue_cpsch;
2965 dqm->ops.destroy_kernel_queue = destroy_kernel_queue_cpsch;
2966 dqm->ops.set_cache_memory_policy = set_cache_memory_policy;
2967 dqm->ops.process_termination = process_termination_cpsch;
2968 dqm->ops.evict_process_queues = evict_process_queues_cpsch;
2969 dqm->ops.restore_process_queues = restore_process_queues_cpsch;
2970 dqm->ops.get_wave_state = get_wave_state;
2971 dqm->ops.reset_queues = reset_queues_cpsch;
2972 dqm->ops.get_queue_checkpoint_info = get_queue_checkpoint_info;
2973 dqm->ops.checkpoint_mqd = checkpoint_mqd;
2974 break;
2975 case KFD_SCHED_POLICY_NO_HWS:
2976 /* initialize dqm for no cp scheduling */
2977 dqm->ops.start = start_nocpsch;
2978 dqm->ops.stop = stop_nocpsch;
2979 dqm->ops.create_queue = create_queue_nocpsch;
2980 dqm->ops.destroy_queue = destroy_queue_nocpsch;
2981 dqm->ops.update_queue = update_queue;
2982 dqm->ops.register_process = register_process;
2983 dqm->ops.unregister_process = unregister_process;
2984 dqm->ops.initialize = initialize_nocpsch;
2985 dqm->ops.uninitialize = uninitialize;
2986 dqm->ops.set_cache_memory_policy = set_cache_memory_policy;
2987 dqm->ops.process_termination = process_termination_nocpsch;
2988 dqm->ops.evict_process_queues = evict_process_queues_nocpsch;
2989 dqm->ops.restore_process_queues =
2990 restore_process_queues_nocpsch;
2991 dqm->ops.get_wave_state = get_wave_state;
2992 dqm->ops.get_queue_checkpoint_info = get_queue_checkpoint_info;
2993 dqm->ops.checkpoint_mqd = checkpoint_mqd;
2994 break;
2995 default:
2996 dev_err(dev->adev->dev, "Invalid scheduling policy %d\n", dqm->sched_policy);
2997 goto out_free;
2998 }
2999
3000 switch (dev->adev->asic_type) {
3001 case CHIP_KAVERI:
3002 case CHIP_HAWAII:
3003 device_queue_manager_init_cik(&dqm->asic_ops);
3004 break;
3005
3006 case CHIP_CARRIZO:
3007 case CHIP_TONGA:
3008 case CHIP_FIJI:
3009 case CHIP_POLARIS10:
3010 case CHIP_POLARIS11:
3011 case CHIP_POLARIS12:
3012 case CHIP_VEGAM:
3013 device_queue_manager_init_vi(&dqm->asic_ops);
3014 break;
3015
3016 default:
3017 if (KFD_GC_VERSION(dev) >= IP_VERSION(12, 0, 0))
3018 device_queue_manager_init_v12(&dqm->asic_ops);
3019 else if (KFD_GC_VERSION(dev) >= IP_VERSION(11, 0, 0))
3020 device_queue_manager_init_v11(&dqm->asic_ops);
3021 else if (KFD_GC_VERSION(dev) >= IP_VERSION(10, 1, 1))
3022 device_queue_manager_init_v10(&dqm->asic_ops);
3023 else if (KFD_GC_VERSION(dev) >= IP_VERSION(9, 0, 1))
3024 device_queue_manager_init_v9(&dqm->asic_ops);
3025 else {
3026 WARN(1, "Unexpected ASIC family %u",
3027 dev->adev->asic_type);
3028 goto out_free;
3029 }
3030 }
3031
3032 if (init_mqd_managers(dqm))
3033 goto out_free;
3034
3035 if (!dev->kfd->shared_resources.enable_mes && allocate_hiq_sdma_mqd(dqm)) {
3036 dev_err(dev->adev->dev, "Failed to allocate hiq sdma mqd trunk buffer\n");
3037 goto out_free;
3038 }
3039
3040 if (!dqm->ops.initialize(dqm)) {
3041 init_waitqueue_head(&dqm->destroy_wait);
3042 return dqm;
3043 }
3044
3045 if (!dev->kfd->shared_resources.enable_mes)
> 3046 deallocate_hiq_sdma_mqd(dev, &dqm->hiq_sdma_mqd);
3047
3048 out_free:
3049 kfree(dqm);
3050 return NULL;
3051 }
3052
> 3053 static void deallocate_hiq_sdma_mqd(struct kfd_node *dev,
3054 struct kfd_mem_obj *mqd)
3055 {
3056 WARN(!mqd, "No hiq sdma mqd trunk to free");
3057
3058 amdgpu_amdkfd_free_gtt_mem(dev->adev, &mqd->gtt_mem);
3059 }
3060
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] drm/amdkfd: fix a memory leak in device_queue_manager_init()
2026-01-04 13:15 [PATCH] drm/amdkfd: fix a memory leak in device_queue_manager_init() Haoxiang Li
2026-01-04 22:41 ` kernel test robot
@ 2026-01-05 18:59 ` Kuehling, Felix
1 sibling, 0 replies; 3+ messages in thread
From: Kuehling, Felix @ 2026-01-05 18:59 UTC (permalink / raw)
To: Haoxiang Li, alexander.deucher, christian.koenig, airlied, simona
Cc: amd-gfx, dri-devel, linux-kernel
On 2026-01-04 08:15, Haoxiang Li wrote:
> If dqm->ops.initialize() fails, add deallocate_hiq_sdma_mqd()
> to release the memory allocated by allocate_hiq_sdma_mqd().
>
> Signed-off-by: Haoxiang Li <lihaoxiang@isrc.iscas.ac.cn>
> ---
> drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> 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 d7a2e7178ea9..58a8d90c1533 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
> @@ -3042,6 +3042,9 @@ struct device_queue_manager *device_queue_manager_init(struct kfd_node *dev)
> return dqm;
> }
>
> + if (!dev->kfd->shared_resources.enable_mes)
> + deallocate_hiq_sdma_mqd(dev, &dqm->hiq_sdma_mqd);
> +
I thing the idea is right. But see the report from the kernel test
robot. Either move deallocate_hiq_sdma_mqd up or add a forward declaration.
With that fixed, the patch is
Reviewed-by: Felix Kuehling <felix.kuehling@amd.com>
If you send an updated patch, I'll apply it to amd-staging-drm-next.
Thanks,
Felix
> out_free:
> kfree(dqm);
> return NULL;
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-01-05 19:00 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-01-04 13:15 [PATCH] drm/amdkfd: fix a memory leak in device_queue_manager_init() Haoxiang Li
2026-01-04 22:41 ` kernel test robot
2026-01-05 18:59 ` Kuehling, Felix
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®