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.

mm/gup: remove dead pgmap refcounting code

Prior to commit aed877c2b425 ("device/dax: properly refcount device dax
pages when mapping") ZONE_DEVICE pages were not fully reference counted
when mapped into user page tables. Instead GUP would take a reference on
the associated pgmap to ensure the results of pfn_to_page() remained
valid.

This is no longer required and most of the code was removed by commit
fd2825b0760a ("mm/gup: remove pXX_devmap usage from get_user_pages()").
Finish cleaning this up by removing the dead calls to put_dev_pagemap()
and the temporary context struct.

Link: https://lkml.kernel.org/r/20250903225926.34702-1-apopple@nvidia.com
Signed-off-by: Alistair Popple <apopple@nvidia.com>
Acked-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Reviewed-by: Dan Williams <dan.j.williams@intel.com>
Reviewed-by: John Hubbard <jhubbard@nvidia.com>
Cc: Oscar Salvador <osalvador@suse.de>
Cc: Peter Xu <peterx@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

authored by

Alistair Popple and committed by
Andrew Morton
d3f7922b 4805ef37

+26 -41
+26 -41
mm/gup.c
··· 28 28 #include "internal.h" 29 29 #include "swap.h" 30 30 31 - struct follow_page_context { 32 - struct dev_pagemap *pgmap; 33 - unsigned int page_mask; 34 - }; 35 - 36 31 static inline void sanity_check_pinned_pages(struct page **pages, 37 32 unsigned long npages) 38 33 { ··· 648 653 649 654 static struct page *follow_huge_pud(struct vm_area_struct *vma, 650 655 unsigned long addr, pud_t *pudp, 651 - int flags, struct follow_page_context *ctx) 656 + int flags, unsigned long *page_mask) 652 657 { 653 658 struct mm_struct *mm = vma->vm_mm; 654 659 struct page *page; ··· 675 680 if (ret) 676 681 page = ERR_PTR(ret); 677 682 else 678 - ctx->page_mask = HPAGE_PUD_NR - 1; 683 + *page_mask = HPAGE_PUD_NR - 1; 679 684 680 685 return page; 681 686 } ··· 701 706 static struct page *follow_huge_pmd(struct vm_area_struct *vma, 702 707 unsigned long addr, pmd_t *pmd, 703 708 unsigned int flags, 704 - struct follow_page_context *ctx) 709 + unsigned long *page_mask) 705 710 { 706 711 struct mm_struct *mm = vma->vm_mm; 707 712 pmd_t pmdval = *pmd; ··· 738 743 #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ 739 744 740 745 page += (addr & ~HPAGE_PMD_MASK) >> PAGE_SHIFT; 741 - ctx->page_mask = HPAGE_PMD_NR - 1; 746 + *page_mask = HPAGE_PMD_NR - 1; 742 747 743 748 return page; 744 749 } ··· 746 751 #else /* CONFIG_PGTABLE_HAS_HUGE_LEAVES */ 747 752 static struct page *follow_huge_pud(struct vm_area_struct *vma, 748 753 unsigned long addr, pud_t *pudp, 749 - int flags, struct follow_page_context *ctx) 754 + int flags, unsigned long *page_mask) 750 755 { 751 756 return NULL; 752 757 } ··· 754 759 static struct page *follow_huge_pmd(struct vm_area_struct *vma, 755 760 unsigned long addr, pmd_t *pmd, 756 761 unsigned int flags, 757 - struct follow_page_context *ctx) 762 + unsigned long *page_mask) 758 763 { 759 764 return NULL; 760 765 } ··· 800 805 } 801 806 802 807 static struct page *follow_page_pte(struct vm_area_struct *vma, 803 - unsigned long address, pmd_t *pmd, unsigned int flags, 804 - struct dev_pagemap **pgmap) 808 + unsigned long address, pmd_t *pmd, unsigned int flags) 805 809 { 806 810 struct mm_struct *mm = vma->vm_mm; 807 811 struct folio *folio; ··· 898 904 static struct page *follow_pmd_mask(struct vm_area_struct *vma, 899 905 unsigned long address, pud_t *pudp, 900 906 unsigned int flags, 901 - struct follow_page_context *ctx) 907 + unsigned long *page_mask) 902 908 { 903 909 pmd_t *pmd, pmdval; 904 910 spinlock_t *ptl; ··· 912 918 if (!pmd_present(pmdval)) 913 919 return no_page_table(vma, flags, address); 914 920 if (likely(!pmd_leaf(pmdval))) 915 - return follow_page_pte(vma, address, pmd, flags, &ctx->pgmap); 921 + return follow_page_pte(vma, address, pmd, flags); 916 922 917 923 if (pmd_protnone(pmdval) && !gup_can_follow_protnone(vma, flags)) 918 924 return no_page_table(vma, flags, address); ··· 925 931 } 926 932 if (unlikely(!pmd_leaf(pmdval))) { 927 933 spin_unlock(ptl); 928 - return follow_page_pte(vma, address, pmd, flags, &ctx->pgmap); 934 + return follow_page_pte(vma, address, pmd, flags); 929 935 } 930 936 if (pmd_trans_huge(pmdval) && (flags & FOLL_SPLIT_PMD)) { 931 937 spin_unlock(ptl); 932 938 split_huge_pmd(vma, pmd, address); 933 939 /* If pmd was left empty, stuff a page table in there quickly */ 934 940 return pte_alloc(mm, pmd) ? ERR_PTR(-ENOMEM) : 935 - follow_page_pte(vma, address, pmd, flags, &ctx->pgmap); 941 + follow_page_pte(vma, address, pmd, flags); 936 942 } 937 - page = follow_huge_pmd(vma, address, pmd, flags, ctx); 943 + page = follow_huge_pmd(vma, address, pmd, flags, page_mask); 938 944 spin_unlock(ptl); 939 945 return page; 940 946 } ··· 942 948 static struct page *follow_pud_mask(struct vm_area_struct *vma, 943 949 unsigned long address, p4d_t *p4dp, 944 950 unsigned int flags, 945 - struct follow_page_context *ctx) 951 + unsigned long *page_mask) 946 952 { 947 953 pud_t *pudp, pud; 948 954 spinlock_t *ptl; ··· 955 961 return no_page_table(vma, flags, address); 956 962 if (pud_leaf(pud)) { 957 963 ptl = pud_lock(mm, pudp); 958 - page = follow_huge_pud(vma, address, pudp, flags, ctx); 964 + page = follow_huge_pud(vma, address, pudp, flags, page_mask); 959 965 spin_unlock(ptl); 960 966 if (page) 961 967 return page; ··· 964 970 if (unlikely(pud_bad(pud))) 965 971 return no_page_table(vma, flags, address); 966 972 967 - return follow_pmd_mask(vma, address, pudp, flags, ctx); 973 + return follow_pmd_mask(vma, address, pudp, flags, page_mask); 968 974 } 969 975 970 976 static struct page *follow_p4d_mask(struct vm_area_struct *vma, 971 977 unsigned long address, pgd_t *pgdp, 972 978 unsigned int flags, 973 - struct follow_page_context *ctx) 979 + unsigned long *page_mask) 974 980 { 975 981 p4d_t *p4dp, p4d; 976 982 ··· 981 987 if (!p4d_present(p4d) || p4d_bad(p4d)) 982 988 return no_page_table(vma, flags, address); 983 989 984 - return follow_pud_mask(vma, address, p4dp, flags, ctx); 990 + return follow_pud_mask(vma, address, p4dp, flags, page_mask); 985 991 } 986 992 987 993 /** ··· 989 995 * @vma: vm_area_struct mapping @address 990 996 * @address: virtual address to look up 991 997 * @flags: flags modifying lookup behaviour 992 - * @ctx: contains dev_pagemap for %ZONE_DEVICE memory pinning and a 993 - * pointer to output page_mask 998 + * @page_mask: a pointer to output page_mask 994 999 * 995 1000 * @flags can have FOLL_ flags set, defined in <linux/mm.h> 996 - * 997 - * When getting pages from ZONE_DEVICE memory, the @ctx->pgmap caches 998 - * the device's dev_pagemap metadata to avoid repeating expensive lookups. 999 1001 * 1000 1002 * When getting an anonymous page and the caller has to trigger unsharing 1001 1003 * of a shared anonymous page first, -EMLINK is returned. The caller should 1002 1004 * trigger a fault with FAULT_FLAG_UNSHARE set. Note that unsharing is only 1003 1005 * relevant with FOLL_PIN and !FOLL_WRITE. 1004 1006 * 1005 - * On output, the @ctx->page_mask is set according to the size of the page. 1007 + * On output, @page_mask is set according to the size of the page. 1006 1008 * 1007 1009 * Return: the mapped (struct page *), %NULL if no mapping exists, or 1008 1010 * an error pointer if there is a mapping to something not represented ··· 1006 1016 */ 1007 1017 static struct page *follow_page_mask(struct vm_area_struct *vma, 1008 1018 unsigned long address, unsigned int flags, 1009 - struct follow_page_context *ctx) 1019 + unsigned long *page_mask) 1010 1020 { 1011 1021 pgd_t *pgd; 1012 1022 struct mm_struct *mm = vma->vm_mm; ··· 1014 1024 1015 1025 vma_pgtable_walk_begin(vma); 1016 1026 1017 - ctx->page_mask = 0; 1027 + *page_mask = 0; 1018 1028 pgd = pgd_offset(mm, address); 1019 1029 1020 1030 if (pgd_none(*pgd) || unlikely(pgd_bad(*pgd))) 1021 1031 page = no_page_table(vma, flags, address); 1022 1032 else 1023 - page = follow_p4d_mask(vma, address, pgd, flags, ctx); 1033 + page = follow_p4d_mask(vma, address, pgd, flags, page_mask); 1024 1034 1025 1035 vma_pgtable_walk_end(vma); 1026 1036 ··· 1358 1368 { 1359 1369 long ret = 0, i = 0; 1360 1370 struct vm_area_struct *vma = NULL; 1361 - struct follow_page_context ctx = { NULL }; 1371 + unsigned long page_mask = 0; 1362 1372 1363 1373 if (!nr_pages) 1364 1374 return 0; ··· 1400 1410 pages ? &page : NULL); 1401 1411 if (ret) 1402 1412 goto out; 1403 - ctx.page_mask = 0; 1413 + page_mask = 0; 1404 1414 goto next_page; 1405 1415 } 1406 1416 ··· 1423 1433 } 1424 1434 cond_resched(); 1425 1435 1426 - page = follow_page_mask(vma, start, gup_flags, &ctx); 1436 + page = follow_page_mask(vma, start, gup_flags, &page_mask); 1427 1437 if (!page || PTR_ERR(page) == -EMLINK) { 1428 1438 ret = faultin_page(vma, start, gup_flags, 1429 1439 PTR_ERR(page) == -EMLINK, locked); ··· 1456 1466 goto out; 1457 1467 } 1458 1468 next_page: 1459 - page_increm = 1 + (~(start >> PAGE_SHIFT) & ctx.page_mask); 1469 + page_increm = 1 + (~(start >> PAGE_SHIFT) & page_mask); 1460 1470 if (page_increm > nr_pages) 1461 1471 page_increm = nr_pages; 1462 1472 ··· 1506 1516 nr_pages -= page_increm; 1507 1517 } while (nr_pages); 1508 1518 out: 1509 - if (ctx.pgmap) 1510 - put_dev_pagemap(ctx.pgmap); 1511 1519 return i ? i : ret; 1512 1520 } 1513 1521 ··· 2841 2853 unsigned long end, unsigned int flags, struct page **pages, 2842 2854 int *nr) 2843 2855 { 2844 - struct dev_pagemap *pgmap = NULL; 2845 2856 int ret = 0; 2846 2857 pte_t *ptep, *ptem; 2847 2858 ··· 2913 2926 ret = 1; 2914 2927 2915 2928 pte_unmap: 2916 - if (pgmap) 2917 - put_dev_pagemap(pgmap); 2918 2929 pte_unmap(ptem); 2919 2930 return ret; 2920 2931 }