lkml.org 
[lkml]   [2023]   [Feb]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Date
    SubjectRe: [PATCH v2 04/46] hugetlb: only adjust address ranges when VMAs want PMD sharing
    On Fri, Feb 17, 2023 at 4:28 PM James Houghton <jthoughton@google.com> 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@redhat.com>
    > Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com>
    > Signed-off-by: James Houghton <jthoughton@google.com>

    Acked-by: Mina Almasry <almasrymina@google.com>

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

    \
     
     \ /
      Last update: 2023-03-27 00:27    [W:7.932 / U:0.148 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site