lkml.org 
[lkml]   [2020]   [Nov]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH v2 1/6] mm/gup: Provide gup_get_pte() more generic
    On Thu, Nov 26, 2020 at 01:01:15PM +0100, Peter Zijlstra wrote:
    > +#ifdef CONFIG_GUP_GET_PTE_LOW_HIGH
    > +/*
    > + * WARNING: only to be used in the get_user_pages_fast() implementation.
    > + * With get_user_pages_fast(), we walk down the pagetables without taking any
    > + * locks. For this we would like to load the pointers atomically, but sometimes
    > + * that is not possible (e.g. without expensive cmpxchg8b on x86_32 PAE). What
    > + * we do have is the guarantee that a PTE will only either go from not present
    > + * to present, or present to not present or both -- it will not switch to a
    > + * completely different present page without a TLB flush in between; something
    > + * that we are blocking by holding interrupts off.

    I feel like this comment needs some love. How about:

    * For walking the pagetables without holding any locks. Some architectures
    * (eg x86-32 PAE) cannot load the entries atomically without using
    * expensive instructions. We are guaranteed that a PTE will only either go
    * from not present to present, or present to not present -- it will not
    * switch to a completely different present page without a TLB flush
    * inbetween; which we are blocking by holding interrupts off.

    And it would be nice to have an assertion that interrupts are disabled
    in the code. Because comments are nice, but nobody reads them.

    > +static inline pte_t ptep_get_lockless(pte_t *ptep)
    > +{
    > + pte_t pte;
    > +
    > + do {
    > + pte.pte_low = ptep->pte_low;
    > + smp_rmb();
    > + pte.pte_high = ptep->pte_high;
    > + smp_rmb();
    > + } while (unlikely(pte.pte_low != ptep->pte_low));
    > +
    > + return pte;
    > +}

    \
     
     \ /
      Last update: 2020-11-26 13:46    [W:4.168 / U:0.408 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site