Message ID | 20201130113603.079835817@infradead.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Clean up i386-PAE | expand |
On Mon, Nov 30, 2020 at 12:27:10PM +0100, Peter Zijlstra wrote: > There's no point in having the identical routines for PTE/PMD have > different names. > > Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> > include/linux/pgtable.h | 7 +------ > mm/hmm.c | 2 +- > mm/mapping_dirty_helpers.c | 2 +- > mm/mprotect.c | 2 +- > mm/userfaultfd.c | 2 +- > 5 files changed, 5 insertions(+), 10 deletions(-) > > +++ b/include/linux/pgtable.h > @@ -1244,11 +1244,6 @@ static inline int pud_trans_unstable(pud > #endif > } > > -static inline pmd_t pmd_read_atomic(pmd_t *pmdp) > -{ > - return pmdp_get_lockless(pmdp); > -} > - > #ifndef arch_needs_pgtable_deposit > #define arch_needs_pgtable_deposit() (false) > #endif > @@ -1275,7 +1270,7 @@ static inline pmd_t pmd_read_atomic(pmd_ > */ > static inline int pmd_none_or_trans_huge_or_clear_bad(pmd_t *pmd) > { > - pmd_t pmdval = pmd_read_atomic(pmd); > + pmd_t pmdval = pmdp_get_lockless(pmd); > /* > * The barrier will stabilize the pmdval in a register or on > * the stack so that it will stop changing under the code. > +++ b/mm/hmm.c > @@ -356,7 +356,7 @@ static int hmm_vma_walk_pmd(pmd_t *pmdp, > * huge or device mapping one and compute corresponding pfn > * values. > */ > - pmd = pmd_read_atomic(pmdp); > + pmd = pmdp_get_lockless(pmdp); > barrier(); > if (!pmd_devmap(pmd) && !pmd_trans_huge(pmd)) > goto again; The pagewalk API doesn't call the functions with interrupts disabled, doesn't this mean we hit this assertion? +#if CONFIG_PGTABLE_LEVELS > 2 +static inline pmd_t pmdp_get_lockless(pmd_t *pmdp) +{ + pmd_t pmd; + + lockdep_assert_irqs_disabled(); + It is only holding the read side of the mmap_sem here Jason
On Mon, Nov 30, 2020 at 11:31:20AM -0400, Jason Gunthorpe wrote: > On Mon, Nov 30, 2020 at 12:27:10PM +0100, Peter Zijlstra wrote: > > There's no point in having the identical routines for PTE/PMD have > > different names. > > > > Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> > > include/linux/pgtable.h | 7 +------ > > mm/hmm.c | 2 +- > > mm/mapping_dirty_helpers.c | 2 +- > > mm/mprotect.c | 2 +- > > mm/userfaultfd.c | 2 +- > > 5 files changed, 5 insertions(+), 10 deletions(-) > > > > +++ b/include/linux/pgtable.h > > @@ -1244,11 +1244,6 @@ static inline int pud_trans_unstable(pud > > #endif > > } > > > > -static inline pmd_t pmd_read_atomic(pmd_t *pmdp) > > -{ > > - return pmdp_get_lockless(pmdp); > > -} > > - > > #ifndef arch_needs_pgtable_deposit > > #define arch_needs_pgtable_deposit() (false) > > #endif > > @@ -1275,7 +1270,7 @@ static inline pmd_t pmd_read_atomic(pmd_ > > */ > > static inline int pmd_none_or_trans_huge_or_clear_bad(pmd_t *pmd) > > { > > - pmd_t pmdval = pmd_read_atomic(pmd); > > + pmd_t pmdval = pmdp_get_lockless(pmd); > > /* > > * The barrier will stabilize the pmdval in a register or on > > * the stack so that it will stop changing under the code. > > +++ b/mm/hmm.c > > @@ -356,7 +356,7 @@ static int hmm_vma_walk_pmd(pmd_t *pmdp, > > * huge or device mapping one and compute corresponding pfn > > * values. > > */ > > - pmd = pmd_read_atomic(pmdp); > > + pmd = pmdp_get_lockless(pmdp); > > barrier(); > > if (!pmd_devmap(pmd) && !pmd_trans_huge(pmd)) > > goto again; > > The pagewalk API doesn't call the functions with interrupts disabled, > doesn't this mean we hit this assertion? > > +#if CONFIG_PGTABLE_LEVELS > 2 > +static inline pmd_t pmdp_get_lockless(pmd_t *pmdp) > +{ > + pmd_t pmd; > + > + lockdep_assert_irqs_disabled(); > + > > It is only holding the read side of the mmap_sem here Hurmph, good point. I'll see what I can do about that.
--- a/include/linux/pgtable.h +++ b/include/linux/pgtable.h @@ -1244,11 +1244,6 @@ static inline int pud_trans_unstable(pud #endif } -static inline pmd_t pmd_read_atomic(pmd_t *pmdp) -{ - return pmdp_get_lockless(pmdp); -} - #ifndef arch_needs_pgtable_deposit #define arch_needs_pgtable_deposit() (false) #endif @@ -1275,7 +1270,7 @@ static inline pmd_t pmd_read_atomic(pmd_ */ static inline int pmd_none_or_trans_huge_or_clear_bad(pmd_t *pmd) { - pmd_t pmdval = pmd_read_atomic(pmd); + pmd_t pmdval = pmdp_get_lockless(pmd); /* * The barrier will stabilize the pmdval in a register or on * the stack so that it will stop changing under the code. --- a/mm/hmm.c +++ b/mm/hmm.c @@ -356,7 +356,7 @@ static int hmm_vma_walk_pmd(pmd_t *pmdp, * huge or device mapping one and compute corresponding pfn * values. */ - pmd = pmd_read_atomic(pmdp); + pmd = pmdp_get_lockless(pmdp); barrier(); if (!pmd_devmap(pmd) && !pmd_trans_huge(pmd)) goto again; --- a/mm/mapping_dirty_helpers.c +++ b/mm/mapping_dirty_helpers.c @@ -123,7 +123,7 @@ static int clean_record_pte(pte_t *pte, static int wp_clean_pmd_entry(pmd_t *pmd, unsigned long addr, unsigned long end, struct mm_walk *walk) { - pmd_t pmdval = pmd_read_atomic(pmd); + pmd_t pmdval = pmdp_get_lockless(pmd); if (!pmd_trans_unstable(&pmdval)) return 0; --- a/mm/mprotect.c +++ b/mm/mprotect.c @@ -190,7 +190,7 @@ static unsigned long change_pte_range(st */ static inline int pmd_none_or_clear_bad_unless_trans_huge(pmd_t *pmd) { - pmd_t pmdval = pmd_read_atomic(pmd); + pmd_t pmdval = pmdp_get_lockless(pmd); /* See pmd_none_or_trans_huge_or_clear_bad for info on barrier */ #ifdef CONFIG_TRANSPARENT_HUGEPAGE --- a/mm/userfaultfd.c +++ b/mm/userfaultfd.c @@ -553,7 +553,7 @@ static __always_inline ssize_t __mcopy_a break; } - dst_pmdval = pmd_read_atomic(dst_pmd); + dst_pmdval = pmdp_get_lockless(dst_pmd); /* * If the dst_pmd is mapped as THP don't * override it and just be strict.
There's no point in having the identical routines for PTE/PMD have different names. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> --- include/linux/pgtable.h | 7 +------ mm/hmm.c | 2 +- mm/mapping_dirty_helpers.c | 2 +- mm/mprotect.c | 2 +- mm/userfaultfd.c | 2 +- 5 files changed, 5 insertions(+), 10 deletions(-)