From: Xiaogang Chen <[email protected]>

Extend kfd/svm function to allocate HPAGE_PMD_SIZE based device memory by buddy
allocator, each drm_buddy_block is HPAGE_PMD_SIZE aligned and to allocate THP
system ram by vma_alloc_folio.

It is preparation for following support for (THP) migration in zone
device-private memory.

Signed-off-by: Xiaogang Chen <[email protected]>
---
 drivers/gpu/drm/amd/amdkfd/kfd_migrate.c | 22 ++++++++++++++++------
 drivers/gpu/drm/amd/amdkfd/kfd_svm.c     |  4 ++--
 2 files changed, 18 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
index 253365a8257e..49a231e60dfa 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
@@ -217,14 +217,18 @@ svm_migrate_addr_to_pfn(struct amdgpu_device *adev, 
unsigned long addr)
 }
 
 static void
-svm_migrate_get_vram_page(struct svm_range *prange, unsigned long pfn)
+svm_migrate_get_vram_page(struct svm_range *prange, unsigned long pfn,
+                          int order)
 {
        struct page *page;
+       struct folio *folio;
 
        page = pfn_to_page(pfn);
        svm_range_bo_ref(prange->svm_bo);
        page->zone_device_data = prange->svm_bo;
-       zone_device_page_init(page, page_pgmap(page), 0);
+
+       folio = page_folio(page);
+       zone_device_folio_init(folio, folio->pgmap, order);
 }
 
 static void
@@ -247,11 +251,17 @@ svm_migrate_addr(struct amdgpu_device *adev, struct page 
*page)
 }
 
 static struct page *
-svm_migrate_get_sys_page(struct vm_area_struct *vma, unsigned long addr)
+svm_migrate_get_sys_page(struct vm_area_struct *vma, unsigned long addr,
+                         unsigned long order)
 {
        struct page *page;
 
-       page = alloc_page_vma(GFP_HIGHUSER, vma, addr);
+       if (order)
+               page = folio_page(vma_alloc_folio(GFP_HIGHUSER,
+                                                 order, vma, addr), 0);
+       else
+               page = alloc_page_vma(GFP_HIGHUSER, vma, addr);
+
        if (page)
                lock_page(page);
 
@@ -300,7 +310,7 @@ svm_migrate_copy_to_vram(struct kfd_node *node, struct 
svm_range *prange,
                if (migrate->src[i] & MIGRATE_PFN_MIGRATE) {
                        dst[i] = cursor.start + (j << PAGE_SHIFT);
                        migrate->dst[i] = svm_migrate_addr_to_pfn(adev, dst[i]);
-                       svm_migrate_get_vram_page(prange, migrate->dst[i]);
+                       svm_migrate_get_vram_page(prange, migrate->dst[i], 0);
                        migrate->dst[i] = migrate_pfn(migrate->dst[i]);
                        mpages++;
                }
@@ -630,7 +640,7 @@ svm_migrate_copy_to_ram(struct amdgpu_device *adev, struct 
svm_range *prange,
                        j = 0;
                }
 
-               dpage = svm_migrate_get_sys_page(migrate->vma, addr);
+               dpage = svm_migrate_get_sys_page(migrate->vma, addr, 0);
                if (!dpage) {
                        pr_debug("failed get page svms 0x%p [0x%lx 0x%lx]\n",
                                 prange->svms, prange->start, prange->last);
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
index fa4054d51f60..280c38932217 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
@@ -578,10 +578,10 @@ svm_range_vram_node_new(struct kfd_node *node, struct 
svm_range *prange,
        }
 
        memset(&bp, 0, sizeof(bp));
-       bp.size = prange->npages * PAGE_SIZE;
+       bp.size = ALIGN(prange->npages * PAGE_SIZE, HPAGE_PMD_SIZE);
        bp.bo_ptr_size = sizeof(struct svm_range_bo);
        bp.destroy = svm_range_bo_destroy;
-       bp.byte_align = PAGE_SIZE;
+       bp.byte_align = HPAGE_PMD_SIZE;
        bp.domain = AMDGPU_GEM_DOMAIN_VRAM;
        bp.flags = AMDGPU_GEM_CREATE_NO_CPU_ACCESS;
        bp.flags |= clear ? AMDGPU_GEM_CREATE_VRAM_CLEARED : 0;
-- 
2.34.1

Reply via email to