]> www.infradead.org Git - users/willy/linux.git/commitdiff
drm/amdkfd: Cleanup kfd_process if init_cwsr_apu fails
authorFelix Kuehling <Felix.Kuehling@amd.com>
Fri, 12 Feb 2021 06:37:52 +0000 (01:37 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 22 Feb 2021 23:03:07 +0000 (18:03 -0500)
If init_cwsr_apu fails, we currently leave the kfd_process structure in
place anyway. The next kfd_open will then succeed, using the existing
kfd_process structure. Fix that by cleaning up the kfd_process after a
failure in init_cwsr_apu.

Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com>
Reviewed-by: Philip Yang <philip.yang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdkfd/kfd_process.c

index ddef335f78db9a3b8868c2d8c612113b044d63a4..65ea0381a8926f9e8249399f6d04883081deb7de 100644 (file)
@@ -775,10 +775,8 @@ struct kfd_process *kfd_create_process(struct file *filep)
                        goto out;
 
                ret = kfd_process_init_cwsr_apu(process, filep);
-               if (ret) {
-                       process = ERR_PTR(ret);
-                       goto out;
-               }
+               if (ret)
+                       goto out_destroy;
 
                if (!procfs.kobj)
                        goto out;
@@ -826,6 +824,14 @@ out:
        mutex_unlock(&kfd_processes_mutex);
 
        return process;
+
+out_destroy:
+       hash_del_rcu(&process->kfd_processes);
+       mutex_unlock(&kfd_processes_mutex);
+       synchronize_srcu(&kfd_processes_srcu);
+       /* kfd_process_free_notifier will trigger the cleanup */
+       mmu_notifier_put(&process->mmu_notifier);
+       return ERR_PTR(ret);
 }
 
 struct kfd_process *kfd_get_process(const struct task_struct *thread)