]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amdgpu: Unregister mce notifier
authorLijo Lazar <lijo.lazar@amd.com>
Thu, 13 Nov 2025 11:37:42 +0000 (17:07 +0530)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 18 Nov 2025 15:52:19 +0000 (10:52 -0500)
Unregister mce notifier on unload.

Signed-off-by: Lijo Lazar <lijo.lazar@amd.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c

index 9e2e098af86c27e7da65c32b0ac94b6e4bc0cc35..2a6cf7963dde228918d3e6f31af658151cdc8d54 100644 (file)
@@ -150,6 +150,8 @@ static void amdgpu_ras_critical_region_fini(struct amdgpu_device *adev);
 
 #ifdef CONFIG_X86_MCE_AMD
 static void amdgpu_register_bad_pages_mca_notifier(struct amdgpu_device *adev);
+static void
+amdgpu_unregister_bad_pages_mca_notifier(struct amdgpu_device *adev);
 struct mce_notifier_adev_list {
        struct amdgpu_device *devs[MAX_GPU_INSTANCE];
        int num_gpu;
@@ -3954,7 +3956,9 @@ static int amdgpu_ras_recovery_fini(struct amdgpu_device *adev)
        mutex_unlock(&con->recovery_lock);
 
        amdgpu_ras_critical_region_init(adev);
-
+#ifdef CONFIG_X86_MCE_AMD
+       amdgpu_unregister_bad_pages_mca_notifier(adev);
+#endif
        return 0;
 }
 /* recovery end */
@@ -4988,6 +4992,28 @@ static void amdgpu_register_bad_pages_mca_notifier(struct amdgpu_device *adev)
                notifier_registered = true;
        }
 }
+static void amdgpu_unregister_bad_pages_mca_notifier(struct amdgpu_device *adev)
+{
+       int i, j;
+
+       if (!notifier_registered && !mce_adev_list.num_gpu)
+               return;
+       for (i = 0, j = 0; i < mce_adev_list.num_gpu; i++) {
+               if (mce_adev_list.devs[i] == adev)
+                       mce_adev_list.devs[i] = NULL;
+               if (!mce_adev_list.devs[i])
+                       ++j;
+       }
+
+       if (j == mce_adev_list.num_gpu) {
+               mce_adev_list.num_gpu = 0;
+               /* Unregister x86 notifier with MCE subsystem. */
+               if (notifier_registered) {
+                       mce_unregister_decode_chain(&amdgpu_bad_page_nb);
+                       notifier_registered = false;
+               }
+       }
+}
 #endif
 
 struct amdgpu_ras *amdgpu_ras_get_context(struct amdgpu_device *adev)