Messages in this thread | | | Date | Fri, 27 Nov 2015 11:12:58 +0100 (CET) | From | Thomas Gleixner <> | Subject | Re: [PATCH 19/37] x86, mm: simplify get_user_pages() PTE bit handling |
| |
On Mon, 16 Nov 2015, Dave Hansen wrote: > +static inline int pte_allows_gup(pte_t pte, int write) > +{ > + /* > + * 'entry_flags' can come from a pte, pmd or pud. Make > + * sure to only check flags here that are valid *and* the > + * same value on all 3 types. (PAT is currently the only > + * one where that is true and is not checked here).
I have a hard time to understand that comment.
/* * 'entry_flags' can come from a pte, pmd or pud. We only check * _PAGE_PRESENT, _PAGE_USER and _PAGE_RW here, which are the * same for all types. */
Is that what you wanted to say?
> + */ > + if (!(pte_flags(pte) & (_PAGE_PRESENT|_PAGE_USER))) > + return 0; > + if (write && !(pte_write(pte))) > + return 0; > + return 1; > +} > + > +static inline int pmd_allows_gup(pmd_t pmd, int write) > +{ > + return pte_allows_gup(*(pte_t *)&pmd, write); > +} > + > +static inline int pud_allows_gup(pud_t pud, int write) > +{ > + return pte_allows_gup(*(pte_t *)&pud, write); > +} > +
> static noinline int gup_huge_pmd(pmd_t pmd, unsigned long addr, > unsigned long end, int write, struct page **pages, int *nr) > { > - unsigned long mask; > struct page *head, *page; > int refs; > > - mask = _PAGE_PRESENT|_PAGE_USER; > - if (write) > - mask |= _PAGE_RW; > - if ((pmd_flags(pmd) & mask) != mask) > + if (!pmd_allows_gup(pmd, write))
Why do you need that extra indirection here of rereading the pmd? You have the pmd already.
Thanks,
tglx
| |