Commit 960d7104 authored by Lucas De Marchi's avatar Lucas De Marchi
Browse files

drm/xe/oa: Handle errors in xe_oa_register()



Let xe_oa_unregister() be handled by devm infra since it's only putting
the kobject. Also, since kobject_create_and_add may fail, handle the
error accordingly.

Reviewed-by: default avatarAshutosh Dixit <ashutosh.dixit@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250213192909.996148-11-lucas.demarchi@intel.com


Signed-off-by: default avatarLucas De Marchi <lucas.demarchi@intel.com>
parent 00f6a86c
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -877,15 +877,17 @@ int xe_device_probe(struct xe_device *xe)

	err = xe_pxp_init(xe);
	if (err)
		goto err_fini_display;
		goto err_remove_display;

	err = drm_dev_register(&xe->drm, 0);
	if (err)
		goto err_fini_display;
		goto err_remove_display;

	xe_display_register(xe);

	xe_oa_register(xe);
	err = xe_oa_register(xe);
	if (err)
		goto err_unregister_display;

	xe_pmu_register(&xe->pmu);

@@ -902,7 +904,9 @@ int xe_device_probe(struct xe_device *xe)

	return devm_add_action_or_reset(xe->drm.dev, xe_device_sanitize, xe);

err_fini_display:
err_unregister_display:
	xe_display_unregister(xe);
err_remove_display:
	xe_display_driver_remove(xe);

	return err;
@@ -971,8 +975,6 @@ void xe_device_remove(struct xe_device *xe)

	xe_display_driver_remove(xe);

	xe_oa_unregister(xe);

	xe_heci_gsc_fini(xe);

	xe_device_call_remove_actions(xe);
+15 −15
Original line number Diff line number Diff line
@@ -2423,36 +2423,36 @@ int xe_oa_remove_config_ioctl(struct drm_device *dev, u64 data, struct drm_file
	return ret;
}

static void xe_oa_unregister(void *arg)
{
	struct xe_oa *oa = arg;

	if (!oa->metrics_kobj)
		return;

	kobject_put(oa->metrics_kobj);
	oa->metrics_kobj = NULL;
}

/**
 * xe_oa_register - Xe OA registration
 * @xe: @xe_device
 *
 * Exposes the metrics sysfs directory upon completion of module initialization
 */
void xe_oa_register(struct xe_device *xe)
int xe_oa_register(struct xe_device *xe)
{
	struct xe_oa *oa = &xe->oa;

	if (!oa->xe)
		return;
		return 0;

	oa->metrics_kobj = kobject_create_and_add("metrics",
						  &xe->drm.primary->kdev->kobj);
}

/**
 * xe_oa_unregister - Xe OA de-registration
 * @xe: @xe_device
 */
void xe_oa_unregister(struct xe_device *xe)
{
	struct xe_oa *oa = &xe->oa;

	if (!oa->metrics_kobj)
		return;
		return -ENOMEM;

	kobject_put(oa->metrics_kobj);
	oa->metrics_kobj = NULL;
	return devm_add_action_or_reset(xe->drm.dev, xe_oa_unregister, oa);
}

static u32 num_oa_units_per_gt(struct xe_gt *gt)
+1 −2
Original line number Diff line number Diff line
@@ -15,8 +15,7 @@ struct xe_gt;
struct xe_hw_engine;

int xe_oa_init(struct xe_device *xe);
void xe_oa_register(struct xe_device *xe);
void xe_oa_unregister(struct xe_device *xe);
int xe_oa_register(struct xe_device *xe);
int xe_oa_stream_open_ioctl(struct drm_device *dev, u64 data, struct drm_file *file);
int xe_oa_add_config_ioctl(struct drm_device *dev, u64 data, struct drm_file *file);
int xe_oa_remove_config_ioctl(struct drm_device *dev, u64 data, struct drm_file *file);