drm/amdgpu: Auto-validate DMABuf imports in compute VMs
[linux-2.6-microblaze.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_gem.c
index 49a5f1c..b53add2 100644 (file)
@@ -187,7 +187,34 @@ static int amdgpu_gem_object_open(struct drm_gem_object *obj,
        else
                ++bo_va->ref_count;
        amdgpu_bo_unreserve(abo);
-       return 0;
+
+       /* Validate and add eviction fence to DMABuf imports with dynamic
+        * attachment in compute VMs. Re-validation will be done by
+        * amdgpu_vm_validate. Fences are on the reservation shared with the
+        * export, which is currently required to be validated and fenced
+        * already by amdgpu_amdkfd_gpuvm_restore_process_bos.
+        *
+        * Nested locking below for the case that a GEM object is opened in
+        * kfd_mem_export_dmabuf. Since the lock below is only taken for imports,
+        * but not for export, this is a different lock class that cannot lead to
+        * circular lock dependencies.
+        */
+       if (!vm->is_compute_context || !vm->process_info)
+               return 0;
+       if (!obj->import_attach ||
+           !dma_buf_is_dynamic(obj->import_attach->dmabuf))
+               return 0;
+       mutex_lock_nested(&vm->process_info->lock, 1);
+       if (!WARN_ON(!vm->process_info->eviction_fence)) {
+               r = amdgpu_amdkfd_bo_validate_and_fence(abo, AMDGPU_GEM_DOMAIN_GTT,
+                                                       &vm->process_info->eviction_fence->base);
+               if (r)
+                       dev_warn(adev->dev, "%d: validate_and_fence failed: %d\n",
+                                vm->task_info.pid, r);
+       }
+       mutex_unlock(&vm->process_info->lock);
+
+       return r;
 }
 
 static void amdgpu_gem_object_close(struct drm_gem_object *obj,