Re: [PATCH v2 04/46] hugetlb: only adjust address ranges when VMAs want PMD sharing

From: Mina Almasry
Date: Fri Feb 17 2023 - 20:10:49 EST


On Fri, Feb 17, 2023 at 4:28 PM James Houghton <jthoughton@xxxxxxxxxx> wrote:
>
> Currently this check is overly aggressive. For some userfaultfd VMAs,
> VMA sharing is disabled, yet we still widen the address range, which is
> used for flushing TLBs and sending MMU notifiers.
>
> This is done now, as HGM VMAs also have sharing disabled, yet would
> still have flush ranges adjusted. Overaggressively flushing TLBs and
> triggering MMU notifiers is particularly harmful with lots of
> high-granularity operations.
>
> Acked-by: Peter Xu <peterx@xxxxxxxxxx>
> Reviewed-by: Mike Kravetz <mike.kravetz@xxxxxxxxxx>
> Signed-off-by: James Houghton <jthoughton@xxxxxxxxxx>

Acked-by: Mina Almasry <almasrymina@xxxxxxxxxx>

>
> diff --git a/mm/hugetlb.c b/mm/hugetlb.c
> index 540cdf9570d3..08004371cfed 100644
> --- a/mm/hugetlb.c
> +++ b/mm/hugetlb.c
> @@ -6999,22 +6999,31 @@ static unsigned long page_table_shareable(struct vm_area_struct *svma,
> return saddr;
> }
>
> -bool want_pmd_share(struct vm_area_struct *vma, unsigned long addr)
> +static bool pmd_sharing_possible(struct vm_area_struct *vma)
> {
> - unsigned long start = addr & PUD_MASK;
> - unsigned long end = start + PUD_SIZE;
> -
> #ifdef CONFIG_USERFAULTFD
> if (uffd_disable_huge_pmd_share(vma))
> return false;
> #endif
> /*
> - * check on proper vm_flags and page table alignment
> + * Only shared VMAs can share PMDs.
> */
> if (!(vma->vm_flags & VM_MAYSHARE))
> return false;
> if (!vma->vm_private_data) /* vma lock required for sharing */
> return false;
> + return true;
> +}
> +
> +bool want_pmd_share(struct vm_area_struct *vma, unsigned long addr)
> +{
> + unsigned long start = addr & PUD_MASK;
> + unsigned long end = start + PUD_SIZE;
> + /*
> + * check on proper vm_flags and page table alignment
> + */
> + if (!pmd_sharing_possible(vma))
> + return false;
> if (!range_in_vma(vma, start, end))
> return false;
> return true;
> @@ -7035,7 +7044,7 @@ void adjust_range_if_pmd_sharing_possible(struct vm_area_struct *vma,
> * vma needs to span at least one aligned PUD size, and the range
> * must be at least partially within in.
> */
> - if (!(vma->vm_flags & VM_MAYSHARE) || !(v_end > v_start) ||
> + if (!pmd_sharing_possible(vma) || !(v_end > v_start) ||
> (*end <= v_start) || (*start >= v_end))
> return;
>
> --
> 2.39.2.637.g21b0678d19-goog
>