OSDN Git Service

drm/amdgpu: Fix handling of KFD initialization failures
authorFelix Kuehling <Felix.Kuehling@amd.com>
Thu, 17 Sep 2020 01:19:34 +0000 (21:19 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 22 Sep 2020 16:24:11 +0000 (12:24 -0400)
Remember KFD module initializaton status in a global variable. Skip KFD
device probing when the module was not initialized. Other amdgpu_amdkfd
calls are then protected by the adev->kfd.dev check.

Also print a clear error message when KFD disables itself. Amdgpu
continues its initialization even when KFD failed.

Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com>
Reviewed-by: Kent Russell <kent.russell@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
drivers/gpu/drm/amd/amdkfd/kfd_module.c

index edff1b7..53d5aa2 100644 (file)
@@ -36,6 +36,8 @@
  */
 uint64_t amdgpu_amdkfd_total_mem_size;
 
+bool kfd_initialized;
+
 int amdgpu_amdkfd_init(void)
 {
        struct sysinfo si;
@@ -51,19 +53,26 @@ int amdgpu_amdkfd_init(void)
 #else
        ret = -ENOENT;
 #endif
+       kfd_initialized = !ret;
 
        return ret;
 }
 
 void amdgpu_amdkfd_fini(void)
 {
-       kgd2kfd_exit();
+       if (kfd_initialized) {
+               kgd2kfd_exit();
+               kfd_initialized = false;
+       }
 }
 
 void amdgpu_amdkfd_device_probe(struct amdgpu_device *adev)
 {
        bool vf = amdgpu_sriov_vf(adev);
 
+       if (!kfd_initialized)
+               return;
+
        adev->kfd.dev = kgd2kfd_probe((struct kgd_dev *)adev,
                                      adev->pdev, adev->asic_type, vf);
 
index b7b16ad..297484c 100644 (file)
@@ -97,6 +97,7 @@ void kfd_chardev_exit(void)
        device_destroy(kfd_class, MKDEV(kfd_char_dev_major, 0));
        class_destroy(kfd_class);
        unregister_chrdev(kfd_char_dev_major, kfd_dev_name);
+       kfd_device = NULL;
 }
 
 struct device *kfd_chardev(void)
index f4b7f7e..5e90fe6 100644 (file)
@@ -70,6 +70,7 @@ err_create_wq:
 err_topology:
        kfd_chardev_exit();
 err_ioctl:
+       pr_err("KFD is disabled due to module initialization failure\n");
        return err;
 }