[Intel-xe] [PATCH] drm/xe: Fix error handling in xe_gt_record_default_lrcs

Lucas De Marchi lucas.demarchi at intel.com
Wed Apr 5 18:21:22 UTC 2023


On Tue, Apr 04, 2023 at 07:59:19PM -0700, Matthew Brost wrote:
>Kill engines if an error is encountered in xe_gt_record_default_lrcs so
>the driver can free these resources on driver teardown.
>
>Signed-off-by: Matthew Brost <matthew.brost at intel.com>
>---
> drivers/gpu/drm/xe/xe_gt.c | 8 ++++++++
> 1 file changed, 8 insertions(+)
>
>diff --git a/drivers/gpu/drm/xe/xe_gt.c b/drivers/gpu/drm/xe/xe_gt.c
>index bc821f431c45..3adde2205b39 100644
>--- a/drivers/gpu/drm/xe/xe_gt.c
>+++ b/drivers/gpu/drm/xe/xe_gt.c
>@@ -301,8 +301,12 @@ int xe_gt_record_default_lrcs(struct xe_gt *gt)
>
> 		gt->default_lrc[hwe->class] = default_lrc;
> put_nop_e:
>+		if (err)
>+			xe_engine_kill(nop_e);
> 		xe_engine_put(nop_e);
> put_engine:
>+		if (err)
>+			xe_engine_kill(e);
> 		xe_engine_put(e);

these error handling here mixed with normal flow seem a little bit hard
to follow. I propose we change them as:

{
	struct xe_engine *e, *nop_e;
	struct xe_vm *vm;

	for_each_hw_engine(hwe, gt, id) {
		void *default_lrc;
		
		e = nop_e = NULL;

		vm = ...
		e = ...
		if (IS_ERR(e)) {
			...
			goto fail;
		}

		...

		xe_engine_put(nop_e);
                 xe_engine_put(e);
                 xe_vm_put(vm);
	}

	return 0;

fail:
	if (nop_e) {
		xe_engine_kill(nop_e);
		xe_engine_put(nop_e);
	}

	if (e) {
		xe_engine_kill(nop_e);
		xe_engine_put(nop_e);
	}
	
	xe_vm_put(vm);

	/* Wait for engine kill */
	msleep(50);

	return err;	
}

Although that msleep() seems arbitrary. Any alternative so we don't need
to keep tweaking the value for slower platforms? What exactly are we
waiting on?

Lucas De Marchi

> put_vm:
> 		xe_vm_put(vm);
>@@ -310,6 +314,10 @@ int xe_gt_record_default_lrcs(struct xe_gt *gt)
> 			break;
> 	}
>
>+	/* Wait for engine kill */
>+	if (err)
>+		msleep(50);
>+
> 	return err;
> }
>
>-- 
>2.34.1
>


More information about the Intel-xe mailing list