The start, end and page_shift values are all saved in the range structure, so we might as well use that for argument passing.
Unified · Split
| @@ -222,7 +222,7 @@ The usage pattern is:: · 221 unmodified lines | |||
| 222 | range.flags = ...; | 222 | range.flags = ...; |
| 223 | range.values = ...; | 223 | range.values = ...; |
| 224 | range.pfn_shift = ...; | 224 | range.pfn_shift = ...; |
| 225 | hmm_range_register(&range); | 225 | hmm_range_register(&range, mirror); |
| 226 | 226 | ||
| 227 | /* | 227 | /* |
| 228 | * Just wait for range to be valid, safe to ignore return value as we | 228 | * Just wait for range to be valid, safe to ignore return value as we |
| @@ -818,8 +818,11 @@ int amdgpu_ttm_tt_get_user_pages(struct amdgpu_bo *bo, struct page **pages) · 817 unmodified lines | |||
| 818 | 0 : range->flags[HMM_PFN_WRITE]; | 818 | 0 : range->flags[HMM_PFN_WRITE]; |
| 819 | range->pfn_flags_mask = 0; | 819 | range->pfn_flags_mask = 0; |
| 820 | range->pfns = pfns; | 820 | range->pfns = pfns; |
| 821 | hmm_range_register(range, mirror, start, | 821 | range->page_shift = PAGE_SHIFT; |
| 822 | start + ttm->num_pages * PAGE_SIZE, PAGE_SHIFT); | 822 | range->start = start; |
| 823 | range->end = start + ttm->num_pages * PAGE_SIZE; | ||
| 824 | |||
| 825 | hmm_range_register(range, mirror); | ||
| 823 | 826 | ||
| 824 | /* | 827 | /* |
| 825 | * Just wait for range to be valid, safe to ignore return value as we | 828 | * Just wait for range to be valid, safe to ignore return value as we |
| @@ -492,9 +492,7 @@ nouveau_range_fault(struct nouveau_svmm *svmm, struct hmm_range *range) · 491 unmodified lines | |||
| 492 | range->default_flags = 0; | 492 | range->default_flags = 0; |
| 493 | range->pfn_flags_mask = -1UL; | 493 | range->pfn_flags_mask = -1UL; |
| 494 | 494 | ||
| 495 | ret = hmm_range_register(range, &svmm->mirror, | 495 | ret = hmm_range_register(range, &svmm->mirror); |
| 496 | range->start, range->end, | ||
| 497 | PAGE_SHIFT); | ||
| 498 | if (ret) { | 496 | if (ret) { |
| 499 | up_read(&svmm->mm->mmap_sem); | 497 | up_read(&svmm->mm->mmap_sem); |
| 500 | return (int)ret; | 498 | return (int)ret; |
| @@ -682,6 +680,7 @@ nouveau_svm_fault(struct nvif_notify *notify) · 181 unmodified lines | |||
| 682 | args.i.p.addr + args.i.p.size, fn - fi); | 680 | args.i.p.addr + args.i.p.size, fn - fi); |
| 683 | 681 | ||
| 684 | /* Have HMM fault pages within the fault window to the GPU. */ | 682 | /* Have HMM fault pages within the fault window to the GPU. */ |
| 683 | range.page_shift = PAGE_SHIFT; | ||
| 685 | range.start = args.i.p.addr; | 684 | range.start = args.i.p.addr; |
| 686 | range.end = args.i.p.addr + args.i.p.size; | 685 | range.end = args.i.p.addr + args.i.p.size; |
| 687 | range.pfns = args.phys; | 686 | range.pfns = args.phys; |
| @@ -400,11 +400,7 @@ void hmm_mirror_unregister(struct hmm_mirror *mirror); · 399 unmodified lines | |||
| 400 | /* | 400 | /* |
| 401 | * Please see Documentation/vm/hmm.rst for how to use the range API. | 401 | * Please see Documentation/vm/hmm.rst for how to use the range API. |
| 402 | */ | 402 | */ |
| 403 | int hmm_range_register(struct hmm_range *range, | 403 | int hmm_range_register(struct hmm_range *range, struct hmm_mirror *mirror); |
| 404 | struct hmm_mirror *mirror, | ||
| 405 | unsigned long start, | ||
| 406 | unsigned long end, | ||
| 407 | unsigned page_shift); | ||
| 408 | void hmm_range_unregister(struct hmm_range *range); | 404 | void hmm_range_unregister(struct hmm_range *range); |
| 409 | 405 | ||
| 410 | /* | 406 | /* |
| @@ -850,35 +850,25 @@ static void hmm_pfns_clear(struct hmm_range *range, · 849 unmodified lines | |||
| 850 | * hmm_range_register() - start tracking change to CPU page table over a range | 850 | * hmm_range_register() - start tracking change to CPU page table over a range |
| 851 | * @range: range | 851 | * @range: range |
| 852 | * @mm: the mm struct for the range of virtual address | 852 | * @mm: the mm struct for the range of virtual address |
| 853 | * @start: start virtual address (inclusive) | 853 | * |
| 854 | * @end: end virtual address (exclusive) | ||
| 855 | * @page_shift: expect page shift for the range | ||
| 856 | * Return: 0 on success, -EFAULT if the address space is no longer valid | 854 | * Return: 0 on success, -EFAULT if the address space is no longer valid |
| 857 | * | 855 | * |
| 858 | * Track updates to the CPU page table see include/linux/hmm.h | 856 | * Track updates to the CPU page table see include/linux/hmm.h |
| 859 | */ | 857 | */ |
| 860 | int hmm_range_register(struct hmm_range *range, | 858 | int hmm_range_register(struct hmm_range *range, struct hmm_mirror *mirror) |
| 861 | struct hmm_mirror *mirror, | ||
| 862 | unsigned long start, | ||
| 863 | unsigned long end, | ||
| 864 | unsigned page_shift) | ||
| 865 | { | 859 | { |
| 866 | unsigned long mask = ((1UL << page_shift) - 1UL); | 860 | unsigned long mask = ((1UL << range->page_shift) - 1UL); |
| 867 | struct hmm *hmm = mirror->hmm; | 861 | struct hmm *hmm = mirror->hmm; |
| 868 | unsigned long flags; | 862 | unsigned long flags; |
| 869 | 863 | ||
| 870 | range->valid = false; | 864 | range->valid = false; |
| 871 | range->hmm = NULL; | 865 | range->hmm = NULL; |
| 872 | 866 | ||
| 873 | if ((start & mask) || (end & mask)) | 867 | if ((range->start & mask) || (range->end & mask)) |
| 874 | return -EINVAL; | 868 | return -EINVAL; |
| 875 | if (start >= end) | 869 | if (range->start >= range->end) |
| 876 | return -EINVAL; | 870 | return -EINVAL; |
| 877 | 871 | ||
| 878 | range->page_shift = page_shift; | ||
| 879 | range->start = start; | ||
| 880 | range->end = end; | ||
| 881 | |||
| 882 | /* Prevent hmm_release() from running while the range is valid */ | 872 | /* Prevent hmm_release() from running while the range is valid */ |
| 883 | if (!mmget_not_zero(hmm->mm)) | 873 | if (!mmget_not_zero(hmm->mm)) |
| 884 | return -EFAULT; | 874 | return -EFAULT; |