Thomas Zimmermann e9f409
From 779596ce6a79e187995f04f143fc5ea44a565ea9 Mon Sep 17 00:00:00 2001
Thomas Zimmermann e9f409
From: Tom Rix <trix@redhat.com>
Thomas Zimmermann e9f409
Date: Thu, 17 Feb 2022 07:38:42 -0800
Thomas Zimmermann e9f409
Subject: drm/amdgpu: fix amdgpu_ras_block_late_init error handler
Thomas Zimmermann e9f409
Git-commit: 779596ce6a79e187995f04f143fc5ea44a565ea9
Thomas Zimmermann e9f409
Patch-mainline: v5.18-rc1
Thomas Zimmermann e9f409
References: bsc#1152489
Thomas Zimmermann e9f409
Thomas Zimmermann e9f409
Clang build fails with
Thomas Zimmermann e9f409
amdgpu_ras.c:2416:7: error: variable 'ras_obj' is used uninitialized
Thomas Zimmermann e9f409
  whenever 'if' condition is true
Thomas Zimmermann e9f409
  if (adev->in_suspend || amdgpu_in_reset(adev)) {
Thomas Zimmermann e9f409
  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Thomas Zimmermann e9f409
Thomas Zimmermann e9f409
amdgpu_ras.c:2453:6: note: uninitialized use occurs here
Thomas Zimmermann e9f409
 if (ras_obj->ras_cb)
Thomas Zimmermann e9f409
     ^~~~~~~
Thomas Zimmermann e9f409
Thomas Zimmermann e9f409
There is a logic error in the error handler's labels.
Thomas Zimmermann e9f409
ex/ The sysfs: is the last goto label in the normal code but
Thomas Zimmermann e9f409
is the middle of error handler.  Rework the error handler.
Thomas Zimmermann e9f409
Thomas Zimmermann e9f409
cleanup: is the first error, so it's handler should be last.
Thomas Zimmermann e9f409
Thomas Zimmermann e9f409
interrupt: is the second error, it's handler is next.  interrupt:
Thomas Zimmermann e9f409
handles the failure of amdgpu_ras_interrupt_add_hander() by
Thomas Zimmermann e9f409
calling amdgpu_ras_interrupt_remove_handler().  This is wrong,
Thomas Zimmermann e9f409
remove() assumes the interrupt has been setup, not torn down by
Thomas Zimmermann e9f409
add().  Change the goto label to cleanup.
Thomas Zimmermann e9f409
Thomas Zimmermann e9f409
sysfs is the last error, it's handler should be first.  sysfs:
Thomas Zimmermann e9f409
handles the failure of amdgpu_ras_sysfs_create() by calling
Thomas Zimmermann e9f409
amdgpu_ras_sysfs_remove().  But when the create() fails there
Thomas Zimmermann e9f409
is nothing added so there is nothing to remove.  This error
Thomas Zimmermann e9f409
handler is not needed. Remove the error handler and change
Thomas Zimmermann e9f409
goto label to interrupt.
Thomas Zimmermann e9f409
Thomas Zimmermann e9f409
Fixes: b293e891b057 ("drm/amdgpu: add helper function to do common ras_late_init/fini (v3)")
Thomas Zimmermann e9f409
Reviewed-by: Luben Tuikov <luben.tuikov@amd.com>
Thomas Zimmermann e9f409
Signed-off-by: Tom Rix <trix@redhat.com>
Thomas Zimmermann e9f409
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Thomas Zimmermann e9f409
Acked-by: Thomas Zimmermann <tzimmermann@suse.de>
Thomas Zimmermann e9f409
---
Thomas Zimmermann e9f409
 drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c |   11 +++++------
Thomas Zimmermann e9f409
 1 file changed, 5 insertions(+), 6 deletions(-)
Thomas Zimmermann e9f409
Thomas Zimmermann e9f409
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
Thomas Zimmermann e9f409
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
Thomas Zimmermann e9f409
@@ -1998,20 +1998,19 @@ int amdgpu_ras_late_init(struct amdgpu_d
Thomas Zimmermann e9f409
 	if (ih_info->cb) {
Thomas Zimmermann e9f409
 		r = amdgpu_ras_interrupt_add_handler(adev, ih_info);
Thomas Zimmermann e9f409
 		if (r)
Thomas Zimmermann e9f409
-			goto interrupt;
Thomas Zimmermann e9f409
+			goto cleanup;
Thomas Zimmermann e9f409
 	}
Thomas Zimmermann e9f409
 
Thomas Zimmermann e9f409
 	r = amdgpu_ras_sysfs_create(adev, fs_info);
Thomas Zimmermann e9f409
 	if (r)
Thomas Zimmermann e9f409
-		goto sysfs;
Thomas Zimmermann e9f409
+		goto interrupt;
Thomas Zimmermann e9f409
 
Thomas Zimmermann e9f409
 	return 0;
Thomas Zimmermann e9f409
-cleanup:
Thomas Zimmermann e9f409
-	amdgpu_ras_sysfs_remove(adev, ras_block);
Thomas Zimmermann e9f409
-sysfs:
Thomas Zimmermann e9f409
+
Thomas Zimmermann e9f409
+interrupt:
Thomas Zimmermann e9f409
 	if (ih_info->cb)
Thomas Zimmermann e9f409
 		amdgpu_ras_interrupt_remove_handler(adev, ih_info);
Thomas Zimmermann e9f409
-interrupt:
Thomas Zimmermann e9f409
+cleanup:
Thomas Zimmermann e9f409
 	amdgpu_ras_feature_enable(adev, ras_block, 0);
Thomas Zimmermann e9f409
 	return r;
Thomas Zimmermann e9f409
 }