Skip to content

Commit 9a9272d

Browse files
author
Fox Snowpatch
committed
1 parent 27527b2 commit 9a9272d

File tree

32 files changed

+822
-339
lines changed

32 files changed

+822
-339
lines changed

Documentation/mm/hmm.rst

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -276,17 +276,12 @@ These can be allocated and freed with::
276276
struct resource *res;
277277
struct dev_pagemap pagemap;
278278

279-
res = request_free_mem_region(&iomem_resource, /* number of bytes */,
280-
"name of driver resource");
281279
pagemap.type = MEMORY_DEVICE_PRIVATE;
282-
pagemap.range.start = res->start;
283-
pagemap.range.end = res->end;
284-
pagemap.nr_range = 1;
280+
pagemap.nr_pages = /* number of pages */;
285281
pagemap.ops = &device_devmem_ops;
286-
memremap_pages(&pagemap, numa_node_id());
282+
memremap_device_private_pagemap(&pagemap, numa_node_id());
287283

288-
memunmap_pages(&pagemap);
289-
release_mem_region(pagemap.range.start, range_len(&pagemap.range));
284+
memunmap_device_private_pagemap(&pagemap);
290285

291286
There are also devm_request_free_mem_region(), devm_memremap_pages(),
292287
devm_memunmap_pages(), and devm_release_mem_region() when the resources can

arch/powerpc/kvm/book3s_hv_uvmem.c

Lines changed: 14 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -636,7 +636,7 @@ void kvmppc_uvmem_drop_pages(const struct kvm_memory_slot *slot,
636636
mutex_lock(&kvm->arch.uvmem_lock);
637637

638638
if (kvmppc_gfn_is_uvmem_pfn(gfn, kvm, &uvmem_pfn)) {
639-
uvmem_page = pfn_to_page(uvmem_pfn);
639+
uvmem_page = device_private_offset_to_page(uvmem_pfn);
640640
pvt = uvmem_page->zone_device_data;
641641
pvt->skip_page_out = skip_page_out;
642642
pvt->remove_gfn = true;
@@ -721,7 +721,7 @@ static struct page *kvmppc_uvmem_get_page(unsigned long gpa, struct kvm *kvm)
721721
pvt->gpa = gpa;
722722
pvt->kvm = kvm;
723723

724-
dpage = pfn_to_page(uvmem_pfn);
724+
dpage = device_private_offset_to_page(uvmem_pfn);
725725
dpage->zone_device_data = pvt;
726726
zone_device_page_init(dpage, 0);
727727
return dpage;
@@ -784,7 +784,7 @@ static int kvmppc_svm_page_in(struct vm_area_struct *vma,
784784
}
785785
}
786786

787-
*mig.dst = migrate_pfn(page_to_pfn(dpage));
787+
*mig.dst = migrate_pfn_from_page(dpage);
788788
migrate_vma_pages(&mig);
789789
out_finalize:
790790
migrate_vma_finalize(&mig);
@@ -888,7 +888,7 @@ static unsigned long kvmppc_share_page(struct kvm *kvm, unsigned long gpa,
888888
srcu_idx = srcu_read_lock(&kvm->srcu);
889889
mutex_lock(&kvm->arch.uvmem_lock);
890890
if (kvmppc_gfn_is_uvmem_pfn(gfn, kvm, &uvmem_pfn)) {
891-
uvmem_page = pfn_to_page(uvmem_pfn);
891+
uvmem_page = device_private_offset_to_page(uvmem_pfn);
892892
pvt = uvmem_page->zone_device_data;
893893
pvt->skip_page_out = true;
894894
/*
@@ -906,7 +906,7 @@ static unsigned long kvmppc_share_page(struct kvm *kvm, unsigned long gpa,
906906

907907
mutex_lock(&kvm->arch.uvmem_lock);
908908
if (kvmppc_gfn_is_uvmem_pfn(gfn, kvm, &uvmem_pfn)) {
909-
uvmem_page = pfn_to_page(uvmem_pfn);
909+
uvmem_page = device_private_offset_to_page(uvmem_pfn);
910910
pvt = uvmem_page->zone_device_data;
911911
pvt->skip_page_out = true;
912912
pvt->remove_gfn = false; /* it continues to be a valid GFN */
@@ -1017,7 +1017,7 @@ static vm_fault_t kvmppc_uvmem_migrate_to_ram(struct vm_fault *vmf)
10171017
static void kvmppc_uvmem_folio_free(struct folio *folio)
10181018
{
10191019
struct page *page = &folio->page;
1020-
unsigned long pfn = page_to_pfn(page) -
1020+
unsigned long pfn = device_private_page_to_offset(page) -
10211021
(kvmppc_uvmem_pgmap.range.start >> PAGE_SHIFT);
10221022
struct kvmppc_uvmem_page_pvt *pvt;
10231023

@@ -1159,8 +1159,6 @@ int kvmppc_uvmem_init(void)
11591159
{
11601160
int ret = 0;
11611161
unsigned long size;
1162-
struct resource *res;
1163-
void *addr;
11641162
unsigned long pfn_last, pfn_first;
11651163

11661164
size = kvmppc_get_secmem_size();
@@ -1174,27 +1172,18 @@ int kvmppc_uvmem_init(void)
11741172
goto out;
11751173
}
11761174

1177-
res = request_free_mem_region(&iomem_resource, size, "kvmppc_uvmem");
1178-
if (IS_ERR(res)) {
1179-
ret = PTR_ERR(res);
1180-
goto out;
1181-
}
1182-
11831175
kvmppc_uvmem_pgmap.type = MEMORY_DEVICE_PRIVATE;
1184-
kvmppc_uvmem_pgmap.range.start = res->start;
1185-
kvmppc_uvmem_pgmap.range.end = res->end;
11861176
kvmppc_uvmem_pgmap.nr_range = 1;
1177+
kvmppc_uvmem_pgmap.nr_pages = size / PAGE_SIZE;
11871178
kvmppc_uvmem_pgmap.ops = &kvmppc_uvmem_ops;
11881179
/* just one global instance: */
11891180
kvmppc_uvmem_pgmap.owner = &kvmppc_uvmem_pgmap;
1190-
addr = memremap_pages(&kvmppc_uvmem_pgmap, NUMA_NO_NODE);
1191-
if (IS_ERR(addr)) {
1192-
ret = PTR_ERR(addr);
1193-
goto out_free_region;
1194-
}
1181+
ret = memremap_device_private_pagemap(&kvmppc_uvmem_pgmap, NUMA_NO_NODE);
1182+
if (ret)
1183+
goto out;
11951184

1196-
pfn_first = res->start >> PAGE_SHIFT;
1197-
pfn_last = pfn_first + (resource_size(res) >> PAGE_SHIFT);
1185+
pfn_first = kvmppc_uvmem_pgmap.range.start >> PAGE_SHIFT;
1186+
pfn_last = pfn_first + (range_len(&kvmppc_uvmem_pgmap.range) >> PAGE_SHIFT);
11981187
kvmppc_uvmem_bitmap = bitmap_zalloc(pfn_last - pfn_first, GFP_KERNEL);
11991188
if (!kvmppc_uvmem_bitmap) {
12001189
ret = -ENOMEM;
@@ -1204,9 +1193,7 @@ int kvmppc_uvmem_init(void)
12041193
pr_info("KVMPPC-UVMEM: Secure Memory size 0x%lx\n", size);
12051194
return ret;
12061195
out_unmap:
1207-
memunmap_pages(&kvmppc_uvmem_pgmap);
1208-
out_free_region:
1209-
release_mem_region(res->start, size);
1196+
memunmap_device_private_pagemap(&kvmppc_uvmem_pgmap);
12101197
out:
12111198
return ret;
12121199
}
@@ -1216,8 +1203,6 @@ void kvmppc_uvmem_free(void)
12161203
if (!kvmppc_uvmem_bitmap)
12171204
return;
12181205

1219-
memunmap_pages(&kvmppc_uvmem_pgmap);
1220-
release_mem_region(kvmppc_uvmem_pgmap.range.start,
1221-
range_len(&kvmppc_uvmem_pgmap.range));
1206+
memunmap_device_private_pagemap(&kvmppc_uvmem_pgmap);
12221207
bitmap_free(kvmppc_uvmem_bitmap);
12231208
}

drivers/gpu/drm/amd/amdkfd/kfd_migrate.c

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -204,17 +204,22 @@ svm_migrate_copy_done(struct amdgpu_device *adev, struct dma_fence *mfence)
204204
}
205205

206206
unsigned long
207-
svm_migrate_addr_to_pfn(struct amdgpu_device *adev, unsigned long addr)
207+
svm_migrate_addr_to_mpfn(struct amdgpu_device *adev, unsigned long addr)
208208
{
209-
return (addr + adev->kfd.pgmap.range.start) >> PAGE_SHIFT;
209+
unsigned long flags = 0;
210+
211+
if (!adev->gmc.xgmi.connected_to_cpu)
212+
flags |= MIGRATE_PFN_DEVICE_PRIVATE;
213+
return migrate_pfn((addr + adev->kfd.pgmap.range.start) >> PAGE_SHIFT) |
214+
flags;
210215
}
211216

212217
static void
213-
svm_migrate_get_vram_page(struct svm_range *prange, unsigned long pfn)
218+
svm_migrate_get_vram_page(struct svm_range *prange, unsigned long mpfn)
214219
{
215220
struct page *page;
216221

217-
page = pfn_to_page(pfn);
222+
page = migrate_pfn_to_page(mpfn);
218223
svm_range_bo_ref(prange->svm_bo);
219224
page->zone_device_data = prange->svm_bo;
220225
zone_device_page_init(page, 0);
@@ -225,7 +230,7 @@ svm_migrate_put_vram_page(struct amdgpu_device *adev, unsigned long addr)
225230
{
226231
struct page *page;
227232

228-
page = pfn_to_page(svm_migrate_addr_to_pfn(adev, addr));
233+
page = migrate_pfn_to_page(svm_migrate_addr_to_mpfn(adev, addr));
229234
unlock_page(page);
230235
put_page(page);
231236
}
@@ -235,7 +240,7 @@ svm_migrate_addr(struct amdgpu_device *adev, struct page *page)
235240
{
236241
unsigned long addr;
237242

238-
addr = page_to_pfn(page) << PAGE_SHIFT;
243+
addr = (migrate_pfn_from_page(page) >> MIGRATE_PFN_SHIFT) << PAGE_SHIFT;
239244
return (addr - adev->kfd.pgmap.range.start);
240245
}
241246

@@ -301,9 +306,8 @@ svm_migrate_copy_to_vram(struct kfd_node *node, struct svm_range *prange,
301306

302307
if (migrate->src[i] & MIGRATE_PFN_MIGRATE) {
303308
dst[i] = cursor.start + (j << PAGE_SHIFT);
304-
migrate->dst[i] = svm_migrate_addr_to_pfn(adev, dst[i]);
309+
migrate->dst[i] = svm_migrate_addr_to_mpfn(adev, dst[i]);
305310
svm_migrate_get_vram_page(prange, migrate->dst[i]);
306-
migrate->dst[i] = migrate_pfn(migrate->dst[i]);
307311
mpages++;
308312
}
309313
spage = migrate_pfn_to_page(migrate->src[i]);
@@ -646,7 +650,7 @@ svm_migrate_copy_to_ram(struct amdgpu_device *adev, struct svm_range *prange,
646650
pr_debug_ratelimited("dma mapping dst to 0x%llx, pfn 0x%lx\n",
647651
dst[i] >> PAGE_SHIFT, page_to_pfn(dpage));
648652

649-
migrate->dst[i] = migrate_pfn(page_to_pfn(dpage));
653+
migrate->dst[i] = migrate_pfn_from_page(dpage);
650654
j++;
651655
}
652656

@@ -1020,9 +1024,9 @@ int kgd2kfd_init_zone_device(struct amdgpu_device *adev)
10201024
{
10211025
struct amdgpu_kfd_dev *kfddev = &adev->kfd;
10221026
struct dev_pagemap *pgmap;
1023-
struct resource *res = NULL;
10241027
unsigned long size;
10251028
void *r;
1029+
int ret;
10261030

10271031
/* Page migration works on gfx9 or newer */
10281032
if (amdgpu_ip_version(adev, GC_HWIP, 0) < IP_VERSION(9, 0, 1))
@@ -1043,11 +1047,7 @@ int kgd2kfd_init_zone_device(struct amdgpu_device *adev)
10431047
pgmap->range.end = adev->gmc.aper_base + adev->gmc.aper_size - 1;
10441048
pgmap->type = MEMORY_DEVICE_COHERENT;
10451049
} else {
1046-
res = devm_request_free_mem_region(adev->dev, &iomem_resource, size);
1047-
if (IS_ERR(res))
1048-
return PTR_ERR(res);
1049-
pgmap->range.start = res->start;
1050-
pgmap->range.end = res->end;
1050+
pgmap->nr_pages = size / PAGE_SIZE;
10511051
pgmap->type = MEMORY_DEVICE_PRIVATE;
10521052
}
10531053

@@ -1058,14 +1058,19 @@ int kgd2kfd_init_zone_device(struct amdgpu_device *adev)
10581058
/* Device manager releases device-specific resources, memory region and
10591059
* pgmap when driver disconnects from device.
10601060
*/
1061-
r = devm_memremap_pages(adev->dev, pgmap);
1062-
if (IS_ERR(r)) {
1061+
if (pgmap->type == MEMORY_DEVICE_PRIVATE) {
1062+
ret = devm_memremap_device_private_pagemap(adev->dev, pgmap);
1063+
} else {
1064+
r = devm_memremap_pages(adev->dev, pgmap);
1065+
if (IS_ERR(r))
1066+
ret = PTR_ERR(r);
1067+
}
1068+
1069+
if (ret) {
10631070
pr_err("failed to register HMM device memory\n");
1064-
if (pgmap->type == MEMORY_DEVICE_PRIVATE)
1065-
devm_release_mem_region(adev->dev, res->start, resource_size(res));
10661071
/* Disable SVM support capability */
10671072
pgmap->type = 0;
1068-
return PTR_ERR(r);
1073+
return ret;
10691074
}
10701075

10711076
pr_debug("reserve %ldMB system memory for VRAM pages struct\n",

drivers/gpu/drm/amd/amdkfd/kfd_migrate.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ int svm_migrate_vram_to_ram(struct svm_range *prange, struct mm_struct *mm,
4848
uint32_t trigger, struct page *fault_page);
4949

5050
unsigned long
51-
svm_migrate_addr_to_pfn(struct amdgpu_device *adev, unsigned long addr);
51+
svm_migrate_addr_to_mpfn(struct amdgpu_device *adev, unsigned long addr);
5252

5353
#endif /* IS_ENABLED(CONFIG_HSA_AMD_SVM) */
5454

drivers/gpu/drm/drm_pagemap.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,7 @@ int drm_pagemap_migrate_to_devmem(struct drm_pagemap_devmem *devmem_allocation,
338338

339339
mmap_assert_locked(mm);
340340

341-
if (!ops->populate_devmem_pfn || !ops->copy_to_devmem ||
341+
if (!ops->populate_devmem_mpfn || !ops->copy_to_devmem ||
342342
!ops->copy_to_ram)
343343
return -EOPNOTSUPP;
344344

@@ -391,7 +391,7 @@ int drm_pagemap_migrate_to_devmem(struct drm_pagemap_devmem *devmem_allocation,
391391
goto err_finalize;
392392
}
393393

394-
err = ops->populate_devmem_pfn(devmem_allocation, npages, migrate.dst);
394+
err = ops->populate_devmem_mpfn(devmem_allocation, npages, migrate.dst);
395395
if (err)
396396
goto err_finalize;
397397

@@ -402,10 +402,9 @@ int drm_pagemap_migrate_to_devmem(struct drm_pagemap_devmem *devmem_allocation,
402402
goto err_finalize;
403403

404404
for (i = 0; i < npages; ++i) {
405-
struct page *page = pfn_to_page(migrate.dst[i]);
405+
struct page *page = migrate_pfn_to_page(migrate.dst[i]);
406406

407407
pages[i] = page;
408-
migrate.dst[i] = migrate_pfn(migrate.dst[i]);
409408
drm_pagemap_get_devmem_page(page, zdd);
410409
}
411410

@@ -495,7 +494,7 @@ static int drm_pagemap_migrate_populate_ram_pfn(struct vm_area_struct *vas,
495494
goto free_pages;
496495

497496
page = folio_page(folio, 0);
498-
mpfn[i] = migrate_pfn(page_to_pfn(page));
497+
mpfn[i] = migrate_pfn_from_page(page);
499498

500499
next:
501500
if (page)
@@ -580,7 +579,7 @@ int drm_pagemap_evict_to_ram(struct drm_pagemap_devmem *devmem_allocation)
580579
pagemap_addr = buf + (2 * sizeof(*src) * npages);
581580
pages = buf + (2 * sizeof(*src) + sizeof(*pagemap_addr)) * npages;
582581

583-
err = ops->populate_devmem_pfn(devmem_allocation, npages, src);
582+
err = ops->populate_devmem_mpfn(devmem_allocation, npages, src);
584583
if (err)
585584
goto err_free;
586585

0 commit comments

Comments
 (0)