Commit 67979060 authored by Michal Wajdeczko's avatar Michal Wajdeczko
Browse files

drm/xe/hw_engine_group: Fix potential leak



If we fail to allocate a workqueue we will leak kzalloc'ed group
object since it was designed to be kfree'ed in the drmm cleanup
action, but we didn't have a chance to register this action yet.

To avoid this leak allocate a group object using drmm_kzalloc()
and start using predefined drmm action to release the workqueue.

Signed-off-by: default avatarMichal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Francois Dugast <francois.dugast@intel.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Reviewed-by: default avatarMatthew Brost <matthew.brost@intel.com>
Link: https://lore.kernel.org/r/20250627184143.1480-1-michal.wajdeczko@intel.com
parent a34ba68d
Loading
Loading
Loading
Loading
+5 −14
Original line number Diff line number Diff line
@@ -12,15 +12,6 @@
#include "xe_hw_engine_group.h"
#include "xe_vm.h"

static void
hw_engine_group_free(struct drm_device *drm, void *arg)
{
	struct xe_hw_engine_group *group = arg;

	destroy_workqueue(group->resume_wq);
	kfree(group);
}

static void
hw_engine_group_resume_lr_jobs_func(struct work_struct *w)
{
@@ -53,7 +44,7 @@ hw_engine_group_alloc(struct xe_device *xe)
	struct xe_hw_engine_group *group;
	int err;

	group = kzalloc(sizeof(*group), GFP_KERNEL);
	group = drmm_kzalloc(&xe->drm, sizeof(*group), GFP_KERNEL);
	if (!group)
		return ERR_PTR(-ENOMEM);

@@ -61,14 +52,14 @@ hw_engine_group_alloc(struct xe_device *xe)
	if (!group->resume_wq)
		return ERR_PTR(-ENOMEM);

	err = drmm_add_action_or_reset(&xe->drm, __drmm_workqueue_release, group->resume_wq);
	if (err)
		return ERR_PTR(err);

	init_rwsem(&group->mode_sem);
	INIT_WORK(&group->resume_work, hw_engine_group_resume_lr_jobs_func);
	INIT_LIST_HEAD(&group->exec_queue_list);

	err = drmm_add_action_or_reset(&xe->drm, hw_engine_group_free, group);
	if (err)
		return ERR_PTR(err);

	return group;
}