drm/amdgpu: get owner ref in validate and map
authorAlex Sierra <alex.sierra@amd.com>
Thu, 6 May 2021 18:18:40 +0000 (13:18 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 1 Jul 2021 04:05:41 +0000 (00:05 -0400)
Get the proper owner reference for amdgpu_hmm_range_get_pages function.
This is useful for partial migrations. To avoid migrating back to
system memory, VRAM pages, that are accessible by all devices in the
same memory domain.
Ex. multiple devices in the same hive.

Signed-off-by: Alex Sierra <alex.sierra@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_svm.c

index 51d89433ca1ba63956f3295b4d78a4a4488eb301..a782af09b9b9d9c7075973bf9583d5dbce016a74 100644 (file)
@@ -1337,6 +1337,17 @@ static void svm_range_unreserve_bos(struct svm_validate_context *ctx)
        ttm_eu_backoff_reservation(&ctx->ticket, &ctx->validate_list);
 }
 
+static void *kfd_svm_page_owner(struct kfd_process *p, int32_t gpuidx)
+{
+       struct kfd_process_device *pdd;
+       struct amdgpu_device *adev;
+
+       pdd = kfd_process_device_from_gpuidx(p, gpuidx);
+       adev = (struct amdgpu_device *)pdd->dev->kgd;
+
+       return SVM_ADEV_PGMAP_OWNER(adev);
+}
+
 /*
  * Validation+GPU mapping with concurrent invalidation (MMU notifiers)
  *
@@ -1367,6 +1378,9 @@ static int svm_range_validate_and_map(struct mm_struct *mm,
 {
        struct svm_validate_context ctx;
        struct hmm_range *hmm_range;
+       struct kfd_process *p;
+       void *owner;
+       int32_t idx;
        int r = 0;
 
        ctx.process = container_of(prange->svms, struct kfd_process, svms);
@@ -1413,10 +1427,19 @@ static int svm_range_validate_and_map(struct mm_struct *mm,
        svm_range_reserve_bos(&ctx);
 
        if (!prange->actual_loc) {
+               p = container_of(prange->svms, struct kfd_process, svms);
+               owner = kfd_svm_page_owner(p, find_first_bit(ctx.bitmap,
+                                                       MAX_GPU_INSTANCE));
+               for_each_set_bit(idx, ctx.bitmap, MAX_GPU_INSTANCE) {
+                       if (kfd_svm_page_owner(p, idx) != owner) {
+                               owner = NULL;
+                               break;
+                       }
+               }
                r = amdgpu_hmm_range_get_pages(&prange->notifier, mm, NULL,
                                               prange->start << PAGE_SHIFT,
                                               prange->npages, &hmm_range,
-                                              false, true, NULL);
+                                              false, true, owner);
                if (r) {
                        pr_debug("failed %d to get svm range pages\n", r);
                        goto unreserve_out;