Message ID | 20210128234242.2677079-1-axelrasmussen@google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v4,1/9] hugetlb: Pass vma into huge_pte_alloc() | expand |
On 1/28/21 3:42 PM, Axel Rasmussen wrote: > From: Peter Xu <peterx@redhat.com> > > It is a preparation work to be able to behave differently in the per > architecture huge_pte_alloc() according to different VMA attributes. > > Signed-off-by: Peter Xu <peterx@redhat.com> > [axelrasmussen@google.com: fixed typo in arch/mips/mm/hugetlbpage.c] > Signed-off-by: Axel Rasmussen <axelrasmussen@google.com> > --- > arch/arm64/mm/hugetlbpage.c | 2 +- > arch/ia64/mm/hugetlbpage.c | 3 ++- > arch/mips/mm/hugetlbpage.c | 4 ++-- > arch/parisc/mm/hugetlbpage.c | 2 +- > arch/powerpc/mm/hugetlbpage.c | 3 ++- > arch/s390/mm/hugetlbpage.c | 2 +- > arch/sh/mm/hugetlbpage.c | 2 +- > arch/sparc/mm/hugetlbpage.c | 2 +- > include/linux/hugetlb.h | 2 +- > mm/hugetlb.c | 6 +++--- > mm/userfaultfd.c | 2 +- > 11 files changed, 16 insertions(+), 14 deletions(-) Sorry for the delay in reviewing. huge_pmd_share() will do a find_vma() to get the vma. So, it would be 'possible' to not add an extra argument to huge_pmd_alloc() and simply do the uffd_disable_huge_pmd_share() check inside vma_shareable. This would reduce the amount of modified code, but would not be as efficient. I prefer passing the vma argument as is done here. Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com>
On 2/1/21 1:38 PM, Mike Kravetz wrote: > On 1/28/21 3:42 PM, Axel Rasmussen wrote: >> From: Peter Xu <peterx@redhat.com> >> >> It is a preparation work to be able to behave differently in the per >> architecture huge_pte_alloc() according to different VMA attributes. >> >> Signed-off-by: Peter Xu <peterx@redhat.com> >> [axelrasmussen@google.com: fixed typo in arch/mips/mm/hugetlbpage.c] >> Signed-off-by: Axel Rasmussen <axelrasmussen@google.com> >> --- >> arch/arm64/mm/hugetlbpage.c | 2 +- >> arch/ia64/mm/hugetlbpage.c | 3 ++- >> arch/mips/mm/hugetlbpage.c | 4 ++-- >> arch/parisc/mm/hugetlbpage.c | 2 +- >> arch/powerpc/mm/hugetlbpage.c | 3 ++- >> arch/s390/mm/hugetlbpage.c | 2 +- >> arch/sh/mm/hugetlbpage.c | 2 +- >> arch/sparc/mm/hugetlbpage.c | 2 +- >> include/linux/hugetlb.h | 2 +- >> mm/hugetlb.c | 6 +++--- >> mm/userfaultfd.c | 2 +- >> 11 files changed, 16 insertions(+), 14 deletions(-) > > Sorry for the delay in reviewing. > > huge_pmd_share() will do a find_vma() to get the vma. So, it would be > 'possible' to not add an extra argument to huge_pmd_alloc() and simply > do the uffd_disable_huge_pmd_share() check inside vma_shareable. This > would reduce the amount of modified code, but would not be as efficient. > I prefer passing the vma argument as is done here. > > Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com> Another thought. We should pass the vma to huge_pmd_share to avoid the find_vma.
On Mon, Feb 01, 2021 at 01:53:14PM -0800, Mike Kravetz wrote: > On 2/1/21 1:38 PM, Mike Kravetz wrote: > > On 1/28/21 3:42 PM, Axel Rasmussen wrote: > >> From: Peter Xu <peterx@redhat.com> > >> > >> It is a preparation work to be able to behave differently in the per > >> architecture huge_pte_alloc() according to different VMA attributes. > >> > >> Signed-off-by: Peter Xu <peterx@redhat.com> > >> [axelrasmussen@google.com: fixed typo in arch/mips/mm/hugetlbpage.c] > >> Signed-off-by: Axel Rasmussen <axelrasmussen@google.com> > >> --- > >> arch/arm64/mm/hugetlbpage.c | 2 +- > >> arch/ia64/mm/hugetlbpage.c | 3 ++- > >> arch/mips/mm/hugetlbpage.c | 4 ++-- > >> arch/parisc/mm/hugetlbpage.c | 2 +- > >> arch/powerpc/mm/hugetlbpage.c | 3 ++- > >> arch/s390/mm/hugetlbpage.c | 2 +- > >> arch/sh/mm/hugetlbpage.c | 2 +- > >> arch/sparc/mm/hugetlbpage.c | 2 +- > >> include/linux/hugetlb.h | 2 +- > >> mm/hugetlb.c | 6 +++--- > >> mm/userfaultfd.c | 2 +- > >> 11 files changed, 16 insertions(+), 14 deletions(-) > > > > Sorry for the delay in reviewing. > > > > huge_pmd_share() will do a find_vma() to get the vma. So, it would be > > 'possible' to not add an extra argument to huge_pmd_alloc() and simply > > do the uffd_disable_huge_pmd_share() check inside vma_shareable. This > > would reduce the amount of modified code, but would not be as efficient. > > I prefer passing the vma argument as is done here. > > > > Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com> > > > Another thought. > > We should pass the vma to huge_pmd_share to avoid the find_vma. Agreed. Seems not relevant to this series, but should be a very nice add-on after this patch can land. Thanks,
diff --git a/arch/arm64/mm/hugetlbpage.c b/arch/arm64/mm/hugetlbpage.c index 55ecf6de9ff7..5b32ec888698 100644 --- a/arch/arm64/mm/hugetlbpage.c +++ b/arch/arm64/mm/hugetlbpage.c @@ -252,7 +252,7 @@ void set_huge_swap_pte_at(struct mm_struct *mm, unsigned long addr, set_pte(ptep, pte); } -pte_t *huge_pte_alloc(struct mm_struct *mm, +pte_t *huge_pte_alloc(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long addr, unsigned long sz) { pgd_t *pgdp; diff --git a/arch/ia64/mm/hugetlbpage.c b/arch/ia64/mm/hugetlbpage.c index b331f94d20ac..f993cb36c062 100644 --- a/arch/ia64/mm/hugetlbpage.c +++ b/arch/ia64/mm/hugetlbpage.c @@ -25,7 +25,8 @@ unsigned int hpage_shift = HPAGE_SHIFT_DEFAULT; EXPORT_SYMBOL(hpage_shift); pte_t * -huge_pte_alloc(struct mm_struct *mm, unsigned long addr, unsigned long sz) +huge_pte_alloc(struct mm_struct *mm, struct vm_area_struct *vma, + unsigned long addr, unsigned long sz) { unsigned long taddr = htlbpage_to_page(addr); pgd_t *pgd; diff --git a/arch/mips/mm/hugetlbpage.c b/arch/mips/mm/hugetlbpage.c index b9f76f433617..7eaff5b07873 100644 --- a/arch/mips/mm/hugetlbpage.c +++ b/arch/mips/mm/hugetlbpage.c @@ -21,8 +21,8 @@ #include <asm/tlb.h> #include <asm/tlbflush.h> -pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr, - unsigned long sz) +pte_t *huge_pte_alloc(struct mm_struct *mm, struct vm_area_struct *vma, + unsigned long addr, unsigned long sz) { pgd_t *pgd; p4d_t *p4d; diff --git a/arch/parisc/mm/hugetlbpage.c b/arch/parisc/mm/hugetlbpage.c index d7ba014a7fbb..e141441bfa64 100644 --- a/arch/parisc/mm/hugetlbpage.c +++ b/arch/parisc/mm/hugetlbpage.c @@ -44,7 +44,7 @@ hugetlb_get_unmapped_area(struct file *file, unsigned long addr, } -pte_t *huge_pte_alloc(struct mm_struct *mm, +pte_t *huge_pte_alloc(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long addr, unsigned long sz) { pgd_t *pgd; diff --git a/arch/powerpc/mm/hugetlbpage.c b/arch/powerpc/mm/hugetlbpage.c index 8b3cc4d688e8..d57276b8791c 100644 --- a/arch/powerpc/mm/hugetlbpage.c +++ b/arch/powerpc/mm/hugetlbpage.c @@ -106,7 +106,8 @@ static int __hugepte_alloc(struct mm_struct *mm, hugepd_t *hpdp, * At this point we do the placement change only for BOOK3S 64. This would * possibly work on other subarchs. */ -pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr, unsigned long sz) +pte_t *huge_pte_alloc(struct mm_struct *mm, struct vm_area_struct *vma, + unsigned long addr, unsigned long sz) { pgd_t *pg; p4d_t *p4; diff --git a/arch/s390/mm/hugetlbpage.c b/arch/s390/mm/hugetlbpage.c index 3b5a4d25ca9b..da36d13ffc16 100644 --- a/arch/s390/mm/hugetlbpage.c +++ b/arch/s390/mm/hugetlbpage.c @@ -189,7 +189,7 @@ pte_t huge_ptep_get_and_clear(struct mm_struct *mm, return pte; } -pte_t *huge_pte_alloc(struct mm_struct *mm, +pte_t *huge_pte_alloc(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long addr, unsigned long sz) { pgd_t *pgdp; diff --git a/arch/sh/mm/hugetlbpage.c b/arch/sh/mm/hugetlbpage.c index 220d7bc43d2b..999ab5916e69 100644 --- a/arch/sh/mm/hugetlbpage.c +++ b/arch/sh/mm/hugetlbpage.c @@ -21,7 +21,7 @@ #include <asm/tlbflush.h> #include <asm/cacheflush.h> -pte_t *huge_pte_alloc(struct mm_struct *mm, +pte_t *huge_pte_alloc(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long addr, unsigned long sz) { pgd_t *pgd; diff --git a/arch/sparc/mm/hugetlbpage.c b/arch/sparc/mm/hugetlbpage.c index ad4b42f04988..04d8790f6c32 100644 --- a/arch/sparc/mm/hugetlbpage.c +++ b/arch/sparc/mm/hugetlbpage.c @@ -279,7 +279,7 @@ unsigned long pud_leaf_size(pud_t pud) { return 1UL << tte_to_shift(*(pte_t *)&p unsigned long pmd_leaf_size(pmd_t pmd) { return 1UL << tte_to_shift(*(pte_t *)&pmd); } unsigned long pte_leaf_size(pte_t pte) { return 1UL << tte_to_shift(pte); } -pte_t *huge_pte_alloc(struct mm_struct *mm, +pte_t *huge_pte_alloc(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long addr, unsigned long sz) { pgd_t *pgd; diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index ebca2ef02212..1e0abb609976 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h @@ -161,7 +161,7 @@ extern struct list_head huge_boot_pages; /* arch callbacks */ -pte_t *huge_pte_alloc(struct mm_struct *mm, +pte_t *huge_pte_alloc(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long addr, unsigned long sz); pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr, unsigned long sz); diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 18f6ee317900..07b23c81b1db 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -3766,7 +3766,7 @@ int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src, src_pte = huge_pte_offset(src, addr, sz); if (!src_pte) continue; - dst_pte = huge_pte_alloc(dst, addr, sz); + dst_pte = huge_pte_alloc(dst, vma, addr, sz); if (!dst_pte) { ret = -ENOMEM; break; @@ -4503,7 +4503,7 @@ vm_fault_t hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, */ mapping = vma->vm_file->f_mapping; i_mmap_lock_read(mapping); - ptep = huge_pte_alloc(mm, haddr, huge_page_size(h)); + ptep = huge_pte_alloc(mm, vma, haddr, huge_page_size(h)); if (!ptep) { i_mmap_unlock_read(mapping); return VM_FAULT_OOM; @@ -5392,7 +5392,7 @@ void adjust_range_if_pmd_sharing_possible(struct vm_area_struct *vma, #endif /* CONFIG_ARCH_WANT_HUGE_PMD_SHARE */ #ifdef CONFIG_ARCH_WANT_GENERAL_HUGETLB -pte_t *huge_pte_alloc(struct mm_struct *mm, +pte_t *huge_pte_alloc(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long addr, unsigned long sz) { pgd_t *pgd; diff --git a/mm/userfaultfd.c b/mm/userfaultfd.c index 7423808640ef..b2ce61c1b50d 100644 --- a/mm/userfaultfd.c +++ b/mm/userfaultfd.c @@ -290,7 +290,7 @@ static __always_inline ssize_t __mcopy_atomic_hugetlb(struct mm_struct *dst_mm, mutex_lock(&hugetlb_fault_mutex_table[hash]); err = -ENOMEM; - dst_pte = huge_pte_alloc(dst_mm, dst_addr, vma_hpagesize); + dst_pte = huge_pte_alloc(dst_mm, dst_vma, dst_addr, vma_hpagesize); if (!dst_pte) { mutex_unlock(&hugetlb_fault_mutex_table[hash]); i_mmap_unlock_read(mapping);