Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

drm/nouveau/uvmm: Prepare for larger pages

Currently memory allocated by VM_BIND uAPI can only have a granuality
matching PAGE_SIZE (4KiB in common case)

To have a better memory management and to allow big (64KiB) and huge
(2MiB) pages later in the series, we are now passing the page shift all
around the internals of UVMM.

Signed-off-by: Mary Guillemard <mary@mary.zone>
Co-developed-by: Mohamed Ahmed <mohamedahmedegypt2001@gmail.com>
Signed-off-by: Mohamed Ahmed <mohamedahmedegypt2001@gmail.com>
Reviewed-by: Lyude Paul <lyude@redhat.com>
Reviewed-by: James Jones <jajones@nvidia.com>
Signed-off-by: Lyude Paul <lyude@redhat.com>
Link: https://patch.msgid.link/20251110-nouveau-compv6-v6-1-83b05475f57c@mary.zone

authored by

Mary Guillemard and committed by
Lyude Paul
6d134953 86db652f

+30 -17
+29 -17
drivers/gpu/drm/nouveau/nouveau_uvmm.c
··· 107 107 108 108 static int 109 109 nouveau_uvmm_vmm_get(struct nouveau_uvmm *uvmm, 110 - u64 addr, u64 range) 110 + u64 addr, u64 range, u8 page_shift) 111 111 { 112 112 struct nvif_vmm *vmm = &uvmm->vmm.vmm; 113 113 114 - return nvif_vmm_raw_get(vmm, addr, range, PAGE_SHIFT); 114 + return nvif_vmm_raw_get(vmm, addr, range, page_shift); 115 115 } 116 116 117 117 static int 118 118 nouveau_uvmm_vmm_put(struct nouveau_uvmm *uvmm, 119 - u64 addr, u64 range) 119 + u64 addr, u64 range, u8 page_shift) 120 120 { 121 121 struct nvif_vmm *vmm = &uvmm->vmm.vmm; 122 122 123 - return nvif_vmm_raw_put(vmm, addr, range, PAGE_SHIFT); 123 + return nvif_vmm_raw_put(vmm, addr, range, page_shift); 124 124 } 125 125 126 126 static int 127 127 nouveau_uvmm_vmm_unmap(struct nouveau_uvmm *uvmm, 128 - u64 addr, u64 range, bool sparse) 128 + u64 addr, u64 range, u8 page_shift, bool sparse) 129 129 { 130 130 struct nvif_vmm *vmm = &uvmm->vmm.vmm; 131 131 132 - return nvif_vmm_raw_unmap(vmm, addr, range, PAGE_SHIFT, sparse); 132 + return nvif_vmm_raw_unmap(vmm, addr, range, page_shift, sparse); 133 133 } 134 134 135 135 static int 136 136 nouveau_uvmm_vmm_map(struct nouveau_uvmm *uvmm, 137 - u64 addr, u64 range, 137 + u64 addr, u64 range, u8 page_shift, 138 138 u64 bo_offset, u8 kind, 139 139 struct nouveau_mem *mem) 140 140 { ··· 163 163 return -ENOSYS; 164 164 } 165 165 166 - return nvif_vmm_raw_map(vmm, addr, range, PAGE_SHIFT, 166 + return nvif_vmm_raw_map(vmm, addr, range, page_shift, 167 167 &args, argc, 168 168 &mem->mem, bo_offset); 169 169 } ··· 182 182 { 183 183 u64 addr = uvma->va.va.addr; 184 184 u64 range = uvma->va.va.range; 185 + u8 page_shift = uvma->page_shift; 185 186 186 - return nouveau_uvmm_vmm_put(to_uvmm(uvma), addr, range); 187 + return nouveau_uvmm_vmm_put(to_uvmm(uvma), addr, range, page_shift); 187 188 } 188 189 189 190 static int ··· 194 193 u64 addr = uvma->va.va.addr; 195 194 u64 offset = uvma->va.gem.offset; 196 195 u64 range = uvma->va.va.range; 196 + u8 page_shift = uvma->page_shift; 197 197 198 198 return nouveau_uvmm_vmm_map(to_uvmm(uvma), addr, range, 199 - offset, uvma->kind, mem); 199 + page_shift, offset, uvma->kind, 200 + mem); 200 201 } 201 202 202 203 static int ··· 206 203 { 207 204 u64 addr = uvma->va.va.addr; 208 205 u64 range = uvma->va.va.range; 206 + u8 page_shift = uvma->page_shift; 209 207 bool sparse = !!uvma->region; 210 208 211 209 if (drm_gpuva_invalidated(&uvma->va)) 212 210 return 0; 213 211 214 - return nouveau_uvmm_vmm_unmap(to_uvmm(uvma), addr, range, sparse); 212 + return nouveau_uvmm_vmm_unmap(to_uvmm(uvma), addr, range, page_shift, sparse); 215 213 } 216 214 217 215 static int ··· 505 501 506 502 if (vmm_get_range) 507 503 nouveau_uvmm_vmm_put(uvmm, vmm_get_start, 508 - vmm_get_range); 504 + vmm_get_range, 505 + PAGE_SHIFT); 509 506 break; 510 507 } 511 508 case DRM_GPUVA_OP_REMAP: { ··· 533 528 u64 ustart = va->va.addr; 534 529 u64 urange = va->va.range; 535 530 u64 uend = ustart + urange; 531 + u8 page_shift = uvma_from_va(va)->page_shift; 536 532 537 533 /* Nothing to do for mappings we merge with. */ 538 534 if (uend == vmm_get_start || ··· 544 538 u64 vmm_get_range = ustart - vmm_get_start; 545 539 546 540 nouveau_uvmm_vmm_put(uvmm, vmm_get_start, 547 - vmm_get_range); 541 + vmm_get_range, 542 + page_shift); 548 543 } 549 544 vmm_get_start = uend; 550 545 break; ··· 599 592 600 593 uvma->region = args->region; 601 594 uvma->kind = args->kind; 595 + uvma->page_shift = PAGE_SHIFT; 602 596 603 597 drm_gpuva_map(&uvmm->base, &uvma->va, op); 604 598 ··· 641 633 642 634 if (vmm_get_range) { 643 635 ret = nouveau_uvmm_vmm_get(uvmm, vmm_get_start, 644 - vmm_get_range); 636 + vmm_get_range, 637 + new->map->page_shift); 645 638 if (ret) { 646 639 op_map_prepare_unwind(new->map); 647 640 goto unwind; ··· 698 689 u64 ustart = va->va.addr; 699 690 u64 urange = va->va.range; 700 691 u64 uend = ustart + urange; 692 + u8 page_shift = uvma_from_va(va)->page_shift; 701 693 702 694 op_unmap_prepare(u); 703 695 ··· 714 704 u64 vmm_get_range = ustart - vmm_get_start; 715 705 716 706 ret = nouveau_uvmm_vmm_get(uvmm, vmm_get_start, 717 - vmm_get_range); 707 + vmm_get_range, page_shift); 718 708 if (ret) { 719 709 op_unmap_prepare_unwind(va); 720 710 goto unwind; ··· 809 799 u64 addr, u64 range) 810 800 { 811 801 struct nouveau_uvma *uvma = uvma_from_va(u->va); 802 + u8 page_shift = uvma->page_shift; 812 803 bool sparse = !!uvma->region; 813 804 814 805 if (!drm_gpuva_invalidated(u->va)) 815 - nouveau_uvmm_vmm_unmap(to_uvmm(uvma), addr, range, sparse); 806 + nouveau_uvmm_vmm_unmap(to_uvmm(uvma), addr, range, page_shift, sparse); 816 807 } 817 808 818 809 static void ··· 893 882 struct drm_gpuva_op_map *n = r->next; 894 883 struct drm_gpuva *va = r->unmap->va; 895 884 struct nouveau_uvma *uvma = uvma_from_va(va); 885 + u8 page_shift = uvma->page_shift; 896 886 897 887 if (unmap) { 898 888 u64 addr = va->va.addr; ··· 905 893 if (n) 906 894 end = n->va.addr; 907 895 908 - nouveau_uvmm_vmm_put(uvmm, addr, end - addr); 896 + nouveau_uvmm_vmm_put(uvmm, addr, end - addr, page_shift); 909 897 } 910 898 911 899 nouveau_uvma_gem_put(uvma);
+1
drivers/gpu/drm/nouveau/nouveau_uvmm.h
··· 33 33 34 34 struct nouveau_uvma_region *region; 35 35 u8 kind; 36 + u8 page_shift; 36 37 }; 37 38 38 39 #define uvmm_from_gpuvm(x) container_of((x), struct nouveau_uvmm, base)