diff mbox series

[v4,1/9] hugetlb: Pass vma into huge_pte_alloc()

Message ID 20210128234242.2677079-1-axelrasmussen@google.com (mailing list archive)
State New
Headers show
Series [v4,1/9] hugetlb: Pass vma into huge_pte_alloc() | expand

Commit Message

Axel Rasmussen Jan. 28, 2021, 11:42 p.m. UTC
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(-)

--
2.30.0.365.g02bc693789-goog

Comments

Mike Kravetz Feb. 1, 2021, 9:38 p.m. UTC | #1
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>
Mike Kravetz Feb. 1, 2021, 9:53 p.m. UTC | #2
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.
Peter Xu Feb. 1, 2021, 10:16 p.m. UTC | #3
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 mbox series

Patch

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);