Re: [RFC PATCH v2 10/19] mm/gup: Pass a NULL vaddr_pin through GUP fast
On 8/9/19 3:58 PM, ira.we...@intel.com wrote: > From: Ira Weiny > > Internally GUP fast needs to know that fast users will not support file > pins. Pass NULL for vaddr_pin through the fast call stack so that the > pin code can return an error if it encounters file backed memory within > the address range. > Reviewed-by: John Hubbard thanks, -- John Hubbard NVIDIA > Signed-off-by: Ira Weiny > --- > mm/gup.c | 65 ++-- > 1 file changed, 40 insertions(+), 25 deletions(-) > > diff --git a/mm/gup.c b/mm/gup.c > index 7a449500f0a6..504af3e9a942 100644 > --- a/mm/gup.c > +++ b/mm/gup.c > @@ -1813,7 +1813,8 @@ static inline struct page *try_get_compound_head(struct > page *page, int refs) > > #ifdef CONFIG_ARCH_HAS_PTE_SPECIAL > static int gup_pte_range(pmd_t pmd, unsigned long addr, unsigned long end, > - unsigned int flags, struct page **pages, int *nr) > + unsigned int flags, struct page **pages, int *nr, > + struct vaddr_pin *vaddr_pin) > { > struct dev_pagemap *pgmap = NULL; > int nr_start = *nr, ret = 0; > @@ -1894,7 +1895,8 @@ static int gup_pte_range(pmd_t pmd, unsigned long addr, > unsigned long end, > * useful to have gup_huge_pmd even if we can't operate on ptes. > */ > static int gup_pte_range(pmd_t pmd, unsigned long addr, unsigned long end, > - unsigned int flags, struct page **pages, int *nr) > + unsigned int flags, struct page **pages, int *nr, > + struct vaddr_pin *vaddr_pin) > { > return 0; > } > @@ -1903,7 +1905,7 @@ static int gup_pte_range(pmd_t pmd, unsigned long addr, > unsigned long end, > #if defined(CONFIG_ARCH_HAS_PTE_DEVMAP) && > defined(CONFIG_TRANSPARENT_HUGEPAGE) > static int __gup_device_huge(unsigned long pfn, unsigned long addr, > unsigned long end, struct page **pages, int *nr, > - unsigned int flags) > + unsigned int flags, struct vaddr_pin *vaddr_pin) > { > int nr_start = *nr; > struct dev_pagemap *pgmap = NULL; > @@ -1938,13 +1940,14 @@ static int __gup_device_huge(unsigned long pfn, > unsigned long addr, > > static int __gup_device_huge_pmd(pmd_t orig, pmd_t *pmdp, unsigned long addr, > unsigned long end, struct page **pages, int *nr, > - unsigned int flags) > + unsigned int flags, struct vaddr_pin *vaddr_pin) > { > unsigned long fault_pfn; > int nr_start = *nr; > > fault_pfn = pmd_pfn(orig) + ((addr & ~PMD_MASK) >> PAGE_SHIFT); > - if (!__gup_device_huge(fault_pfn, addr, end, pages, nr, flags)) > + if (!__gup_device_huge(fault_pfn, addr, end, pages, nr, flags, > +vaddr_pin)) > return 0; > > if (unlikely(pmd_val(orig) != pmd_val(*pmdp))) { > @@ -1957,13 +1960,14 @@ static int __gup_device_huge_pmd(pmd_t orig, pmd_t > *pmdp, unsigned long addr, > > static int __gup_device_huge_pud(pud_t orig, pud_t *pudp, unsigned long addr, > unsigned long end, struct page **pages, int *nr, > - unsigned int flags) > + unsigned int flags, struct vaddr_pin *vaddr_pin) > { > unsigned long fault_pfn; > int nr_start = *nr; > > fault_pfn = pud_pfn(orig) + ((addr & ~PUD_MASK) >> PAGE_SHIFT); > - if (!__gup_device_huge(fault_pfn, addr, end, pages, nr, flags)) > + if (!__gup_device_huge(fault_pfn, addr, end, pages, nr, flags, > +vaddr_pin)) > return 0; > > if (unlikely(pud_val(orig) != pud_val(*pudp))) { > @@ -1975,7 +1979,7 @@ static int __gup_device_huge_pud(pud_t orig, pud_t > *pudp, unsigned long addr, > #else > static int __gup_device_huge_pmd(pmd_t orig, pmd_t *pmdp, unsigned long addr, > unsigned long end, struct page **pages, int *nr, > - unsigned int flags) > + unsigned int flags, struct vaddr_pin *vaddr_pin) > { > BUILD_BUG(); > return 0; > @@ -1983,7 +1987,7 @@ static int __gup_device_huge_pmd(pmd_t orig, pmd_t > *pmdp, unsigned long addr, > > static int __gup_device_huge_pud(pud_t pud, pud_t *pudp, unsigned long addr, > unsigned long end, struct page **pages, int *nr, > - unsigned int flags) > + unsigned int flags, struct vaddr_pin *vaddr_pin) > { > BUILD_BUG(); > return 0; > @@ -2075,7 +2079,8 @@ static inline int gup_huge_pd(hugepd_t hugepd, unsigned > long addr, > #endif /* CONFIG_ARCH_HAS_HUGEPD */ > > static int gup_huge_pmd(pmd_t orig, pmd_t *pmdp, unsigned long addr, > - unsigned long end, unsigned int flags, struct page **pages, int > *nr) > + unsigned long end, unsigned int flags, struct page **pages, > + int *nr, struct vaddr_pin *vaddr_pin) > { > struct page *head, *page; > int refs; > @@ -2087,7 +2092,7 @@
[RFC PATCH v2 10/19] mm/gup: Pass a NULL vaddr_pin through GUP fast
From: Ira Weiny Internally GUP fast needs to know that fast users will not support file pins. Pass NULL for vaddr_pin through the fast call stack so that the pin code can return an error if it encounters file backed memory within the address range. Signed-off-by: Ira Weiny --- mm/gup.c | 65 ++-- 1 file changed, 40 insertions(+), 25 deletions(-) diff --git a/mm/gup.c b/mm/gup.c index 7a449500f0a6..504af3e9a942 100644 --- a/mm/gup.c +++ b/mm/gup.c @@ -1813,7 +1813,8 @@ static inline struct page *try_get_compound_head(struct page *page, int refs) #ifdef CONFIG_ARCH_HAS_PTE_SPECIAL static int gup_pte_range(pmd_t pmd, unsigned long addr, unsigned long end, -unsigned int flags, struct page **pages, int *nr) +unsigned int flags, struct page **pages, int *nr, +struct vaddr_pin *vaddr_pin) { struct dev_pagemap *pgmap = NULL; int nr_start = *nr, ret = 0; @@ -1894,7 +1895,8 @@ static int gup_pte_range(pmd_t pmd, unsigned long addr, unsigned long end, * useful to have gup_huge_pmd even if we can't operate on ptes. */ static int gup_pte_range(pmd_t pmd, unsigned long addr, unsigned long end, -unsigned int flags, struct page **pages, int *nr) +unsigned int flags, struct page **pages, int *nr, +struct vaddr_pin *vaddr_pin) { return 0; } @@ -1903,7 +1905,7 @@ static int gup_pte_range(pmd_t pmd, unsigned long addr, unsigned long end, #if defined(CONFIG_ARCH_HAS_PTE_DEVMAP) && defined(CONFIG_TRANSPARENT_HUGEPAGE) static int __gup_device_huge(unsigned long pfn, unsigned long addr, unsigned long end, struct page **pages, int *nr, - unsigned int flags) + unsigned int flags, struct vaddr_pin *vaddr_pin) { int nr_start = *nr; struct dev_pagemap *pgmap = NULL; @@ -1938,13 +1940,14 @@ static int __gup_device_huge(unsigned long pfn, unsigned long addr, static int __gup_device_huge_pmd(pmd_t orig, pmd_t *pmdp, unsigned long addr, unsigned long end, struct page **pages, int *nr, - unsigned int flags) + unsigned int flags, struct vaddr_pin *vaddr_pin) { unsigned long fault_pfn; int nr_start = *nr; fault_pfn = pmd_pfn(orig) + ((addr & ~PMD_MASK) >> PAGE_SHIFT); - if (!__gup_device_huge(fault_pfn, addr, end, pages, nr, flags)) + if (!__gup_device_huge(fault_pfn, addr, end, pages, nr, flags, + vaddr_pin)) return 0; if (unlikely(pmd_val(orig) != pmd_val(*pmdp))) { @@ -1957,13 +1960,14 @@ static int __gup_device_huge_pmd(pmd_t orig, pmd_t *pmdp, unsigned long addr, static int __gup_device_huge_pud(pud_t orig, pud_t *pudp, unsigned long addr, unsigned long end, struct page **pages, int *nr, - unsigned int flags) + unsigned int flags, struct vaddr_pin *vaddr_pin) { unsigned long fault_pfn; int nr_start = *nr; fault_pfn = pud_pfn(orig) + ((addr & ~PUD_MASK) >> PAGE_SHIFT); - if (!__gup_device_huge(fault_pfn, addr, end, pages, nr, flags)) + if (!__gup_device_huge(fault_pfn, addr, end, pages, nr, flags, + vaddr_pin)) return 0; if (unlikely(pud_val(orig) != pud_val(*pudp))) { @@ -1975,7 +1979,7 @@ static int __gup_device_huge_pud(pud_t orig, pud_t *pudp, unsigned long addr, #else static int __gup_device_huge_pmd(pmd_t orig, pmd_t *pmdp, unsigned long addr, unsigned long end, struct page **pages, int *nr, - unsigned int flags) + unsigned int flags, struct vaddr_pin *vaddr_pin) { BUILD_BUG(); return 0; @@ -1983,7 +1987,7 @@ static int __gup_device_huge_pmd(pmd_t orig, pmd_t *pmdp, unsigned long addr, static int __gup_device_huge_pud(pud_t pud, pud_t *pudp, unsigned long addr, unsigned long end, struct page **pages, int *nr, - unsigned int flags) + unsigned int flags, struct vaddr_pin *vaddr_pin) { BUILD_BUG(); return 0; @@ -2075,7 +2079,8 @@ static inline int gup_huge_pd(hugepd_t hugepd, unsigned long addr, #endif /* CONFIG_ARCH_HAS_HUGEPD */ static int gup_huge_pmd(pmd_t orig, pmd_t *pmdp, unsigned long addr, - unsigned long end, unsigned int flags, struct page **pages, int *nr) + unsigned long end, unsigned int flags, struct page **pages, + int *nr, struct vaddr_pin *vaddr_pin) { struct page *head, *page; int refs; @@ -2087,7 +2092,7 @@ static int gup_huge_pmd(pmd_t orig, pmd_t *pmdp, unsigned long addr, if (unlikely(flags & FOLL_LONGTERM)) return 0; return __gup_device_huge_pmd(orig, pmdp, addr, end, pages, nr, -