]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amdkfd: Dequeue user queues when process mm released
authorPhilip Yang <Philip.Yang@amd.com>
Wed, 15 Oct 2025 19:17:54 +0000 (15:17 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 28 Oct 2025 13:59:44 +0000 (09:59 -0400)
Move dequeue user queues and destroy user queues from
kfd_process_wq_release to mmu notifier release callback, to ensure no
system memory access from GPU because the process memory is going to
free from CPU after mmu release notifier callback returns.

Destroy queue releases the svm prange queue_refcount, this also removes
fake flase positive warning message "Freeing queue vital buffer" message
if application crash or killed.

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

index ddfe30c13e9d6e5c2f1c43ab8581c56b8c79e2b8..f5d173f1ca3b587f9f0fe42283f867a5aa317b61 100644 (file)
@@ -1162,9 +1162,6 @@ static void kfd_process_wq_release(struct work_struct *work)
                                             release_work);
        struct dma_fence *ef;
 
-       kfd_process_dequeue_from_all_devices(p);
-       pqm_uninit(&p->pqm);
-
        /*
         * If GPU in reset, user queues may still running, wait for reset complete.
         */
@@ -1226,6 +1223,14 @@ static void kfd_process_notifier_release_internal(struct kfd_process *p)
        cancel_delayed_work_sync(&p->eviction_work);
        cancel_delayed_work_sync(&p->restore_work);
 
+       /*
+        * Dequeue and destroy user queues, it is not safe for GPU to access
+        * system memory after mmu release notifier callback returns because
+        * exit_mmap free process memory afterwards.
+        */
+       kfd_process_dequeue_from_all_devices(p);
+       pqm_uninit(&p->pqm);
+
        for (i = 0; i < p->n_pdds; i++) {
                struct kfd_process_device *pdd = p->pdds[i];