mm/memory.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
There is not need to modify page table synchronization mask
while apply_to_pte_range() holds user page tables spinlock.
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
---
mm/memory.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/mm/memory.c b/mm/memory.c
index 8eba595056fe..6849ab4e44bf 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -3035,12 +3035,13 @@ static int apply_to_pte_range(struct mm_struct *mm, pmd_t *pmd,
}
} while (pte++, addr += PAGE_SIZE, addr != end);
}
- *mask |= PGTBL_PTE_MODIFIED;
arch_leave_lazy_mmu_mode();
if (mm != &init_mm)
pte_unmap_unlock(mapped_pte, ptl);
+ *mask |= PGTBL_PTE_MODIFIED;
+
return err;
}
--
2.48.1
On 23/06/25 1:34 pm, Alexander Gordeev wrote: > There is not need to modify page table synchronization mask > while apply_to_pte_range() holds user page tables spinlock. I don't get you, what is the problem with the current code? Are you just concerned about the duration of holding the lock? > > Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com> > --- > mm/memory.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/mm/memory.c b/mm/memory.c > index 8eba595056fe..6849ab4e44bf 100644 > --- a/mm/memory.c > +++ b/mm/memory.c > @@ -3035,12 +3035,13 @@ static int apply_to_pte_range(struct mm_struct *mm, pmd_t *pmd, > } > } while (pte++, addr += PAGE_SIZE, addr != end); > } > - *mask |= PGTBL_PTE_MODIFIED; > > arch_leave_lazy_mmu_mode(); > > if (mm != &init_mm) > pte_unmap_unlock(mapped_pte, ptl); > + *mask |= PGTBL_PTE_MODIFIED; > + > return err; > } >
On Mon, Jun 23, 2025 at 02:26:29PM +0530, Dev Jain wrote: > > On 23/06/25 1:34 pm, Alexander Gordeev wrote: > > There is not need to modify page table synchronization mask > > while apply_to_pte_range() holds user page tables spinlock. > > I don't get you, what is the problem with the current code? > Are you just concerned about the duration of holding the > lock? Yes. > > Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com> > > --- > > mm/memory.c | 3 ++- > > 1 file changed, 2 insertions(+), 1 deletion(-) > > > > diff --git a/mm/memory.c b/mm/memory.c > > index 8eba595056fe..6849ab4e44bf 100644 > > --- a/mm/memory.c > > +++ b/mm/memory.c > > @@ -3035,12 +3035,13 @@ static int apply_to_pte_range(struct mm_struct *mm, pmd_t *pmd, > > } > > } while (pte++, addr += PAGE_SIZE, addr != end); > > } > > - *mask |= PGTBL_PTE_MODIFIED; > > arch_leave_lazy_mmu_mode(); > > if (mm != &init_mm) > > pte_unmap_unlock(mapped_pte, ptl); > > + *mask |= PGTBL_PTE_MODIFIED; > > + > > return err; > > }
On 23/06/25 3:07 pm, Alexander Gordeev wrote: > On Mon, Jun 23, 2025 at 02:26:29PM +0530, Dev Jain wrote: >> On 23/06/25 1:34 pm, Alexander Gordeev wrote: >>> There is not need to modify page table synchronization mask >>> while apply_to_pte_range() holds user page tables spinlock. >> I don't get you, what is the problem with the current code? >> Are you just concerned about the duration of holding the >> lock? > Yes. Doesn't really matter but still a correct change: Reviewed-by: Dev Jain <dev.jain@arm.com> > >>> Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com> >>> --- >>> mm/memory.c | 3 ++- >>> 1 file changed, 2 insertions(+), 1 deletion(-) >>> >>> diff --git a/mm/memory.c b/mm/memory.c >>> index 8eba595056fe..6849ab4e44bf 100644 >>> --- a/mm/memory.c >>> +++ b/mm/memory.c >>> @@ -3035,12 +3035,13 @@ static int apply_to_pte_range(struct mm_struct *mm, pmd_t *pmd, >>> } >>> } while (pte++, addr += PAGE_SIZE, addr != end); >>> } >>> - *mask |= PGTBL_PTE_MODIFIED; >>> arch_leave_lazy_mmu_mode(); >>> if (mm != &init_mm) >>> pte_unmap_unlock(mapped_pte, ptl); >>> + *mask |= PGTBL_PTE_MODIFIED; >>> + >>> return err; >>> }
On 23.06.25 12:09, Dev Jain wrote: > > On 23/06/25 3:07 pm, Alexander Gordeev wrote: >> On Mon, Jun 23, 2025 at 02:26:29PM +0530, Dev Jain wrote: >>> On 23/06/25 1:34 pm, Alexander Gordeev wrote: >>>> There is not need to modify page table synchronization mask >>>> while apply_to_pte_range() holds user page tables spinlock. >>> I don't get you, what is the problem with the current code? >>> Are you just concerned about the duration of holding the >>> lock? >> Yes. > > Doesn't really matter but still a correct change: Let's ask the real questions: who checks PGTBL_PTE_MODIFIED? I see if (mask & ARCH_PAGE_TABLE_SYNC_MASK) arch_sync_kernel_mappings(start, start + size); And then arch/arm/include/asm/page.h:#define ARCH_PAGE_TABLE_SYNC_MASK PGTBL_PMD_MODIFIED arch/x86/include/asm/pgtable-2level_types.h:#define ARCH_PAGE_TABLE_SYNC_MASK PGTBL_PMD_MODIFIED arch/x86/include/asm/pgtable-3level_types.h:#define ARCH_PAGE_TABLE_SYNC_MASK PGTBL_PMD_MODIFIED Which makes me wonder why we need PGTBL_PTE_MODIFIED at all? Is there some other check I am missing? (same question regarding everything excepy PGTBL_PMD_MODIFIED, because that actually seems to be used) -- Cheers, David / dhildenb
On Mon, Jun 23, 2025 at 09:45:34PM +0200, David Hildenbrand wrote: ... > Let's ask the real questions: who checks PGTBL_PTE_MODIFIED? > > I see > > if (mask & ARCH_PAGE_TABLE_SYNC_MASK) > arch_sync_kernel_mappings(start, start + size); > > And then > > arch/arm/include/asm/page.h:#define ARCH_PAGE_TABLE_SYNC_MASK PGTBL_PMD_MODIFIED > arch/x86/include/asm/pgtable-2level_types.h:#define ARCH_PAGE_TABLE_SYNC_MASK PGTBL_PMD_MODIFIED > arch/x86/include/asm/pgtable-3level_types.h:#define ARCH_PAGE_TABLE_SYNC_MASK PGTBL_PMD_MODIFIED > > > Which makes me wonder why we need PGTBL_PTE_MODIFIED at all? Is there some other check I am missing? > > (same question regarding everything excepy PGTBL_PMD_MODIFIED, because that actually seems to be used) AFAICT it was thought as architecture-specific: /* * Architectures can set this mask to a combination of PGTBL_P?D_MODIFIED values * and let generic vmalloc and ioremap code know when arch_sync_kernel_mappings() * needs to be called. */ #ifndef ARCH_PAGE_TABLE_SYNC_MASK #define ARCH_PAGE_TABLE_SYNC_MASK 0 #endif Not sure if that needs to be addressed at all. > -- > Cheers, > > David / dhildenb Thanks!
On 24.06.25 11:37, Alexander Gordeev wrote: > On Mon, Jun 23, 2025 at 09:45:34PM +0200, David Hildenbrand wrote: > ... >> Let's ask the real questions: who checks PGTBL_PTE_MODIFIED? >> >> I see >> >> if (mask & ARCH_PAGE_TABLE_SYNC_MASK) >> arch_sync_kernel_mappings(start, start + size); >> >> And then >> >> arch/arm/include/asm/page.h:#define ARCH_PAGE_TABLE_SYNC_MASK PGTBL_PMD_MODIFIED >> arch/x86/include/asm/pgtable-2level_types.h:#define ARCH_PAGE_TABLE_SYNC_MASK PGTBL_PMD_MODIFIED >> arch/x86/include/asm/pgtable-3level_types.h:#define ARCH_PAGE_TABLE_SYNC_MASK PGTBL_PMD_MODIFIED >> >> >> Which makes me wonder why we need PGTBL_PTE_MODIFIED at all? Is there some other check I am missing? >> >> (same question regarding everything excepy PGTBL_PMD_MODIFIED, because that actually seems to be used) > > AFAICT it was thought as architecture-specific: > > /* > * Architectures can set this mask to a combination of PGTBL_P?D_MODIFIED values > * and let generic vmalloc and ioremap code know when arch_sync_kernel_mappings() > * needs to be called. > */ > #ifndef ARCH_PAGE_TABLE_SYNC_MASK > #define ARCH_PAGE_TABLE_SYNC_MASK 0 > #endif > > Not sure if that needs to be addressed at all. Okay, if there are no users of PGTBL_PTE_MODIFIED we could just ... remove it. Dead code. -- Cheers, David / dhildenb
On Tue, Jun 24, 2025 at 11:40:05AM +0200, David Hildenbrand wrote: > On 24.06.25 11:37, Alexander Gordeev wrote: > > On Mon, Jun 23, 2025 at 09:45:34PM +0200, David Hildenbrand wrote: > > ... > > > Let's ask the real questions: who checks PGTBL_PTE_MODIFIED? > > > > > > I see > > > > > > if (mask & ARCH_PAGE_TABLE_SYNC_MASK) > > > arch_sync_kernel_mappings(start, start + size); > > > > > > And then > > > > > > arch/arm/include/asm/page.h:#define ARCH_PAGE_TABLE_SYNC_MASK PGTBL_PMD_MODIFIED > > > arch/x86/include/asm/pgtable-2level_types.h:#define ARCH_PAGE_TABLE_SYNC_MASK PGTBL_PMD_MODIFIED > > > arch/x86/include/asm/pgtable-3level_types.h:#define ARCH_PAGE_TABLE_SYNC_MASK PGTBL_PMD_MODIFIED > > > > > > > > > Which makes me wonder why we need PGTBL_PTE_MODIFIED at all? Is there some other check I am missing? > > > > > > (same question regarding everything excepy PGTBL_PMD_MODIFIED, because that actually seems to be used) > > > > AFAICT it was thought as architecture-specific: > > > > /* > > * Architectures can set this mask to a combination of PGTBL_P?D_MODIFIED values > > * and let generic vmalloc and ioremap code know when arch_sync_kernel_mappings() > > * needs to be called. > > */ > > #ifndef ARCH_PAGE_TABLE_SYNC_MASK > > #define ARCH_PAGE_TABLE_SYNC_MASK 0 > > #endif > > > > Not sure if that needs to be addressed at all. > > Okay, if there are no users of PGTBL_PTE_MODIFIED we could just ... remove > it. Dead code. As you noticed, PGTBL_PMD_MODIFIED bit is used only. Thus, all other bits would have to be removed as well, not just PGTBL_PTE_MODIFIED? That is more or less revert of at least the below commits and rewriting it in a PMD-focused manner: 2ba3e6947aed ("mm/vmalloc: track which page-table levels were modified") d8626138009b ("mm: add functions to track page directory modifications") That would be a completely different effort, which I am not aming at ;) > -- > Cheers, > > David / dhildenb Thanks!
On 24.06.25 14:00, Alexander Gordeev wrote: > On Tue, Jun 24, 2025 at 11:40:05AM +0200, David Hildenbrand wrote: >> On 24.06.25 11:37, Alexander Gordeev wrote: >>> On Mon, Jun 23, 2025 at 09:45:34PM +0200, David Hildenbrand wrote: >>> ... >>>> Let's ask the real questions: who checks PGTBL_PTE_MODIFIED? >>>> >>>> I see >>>> >>>> if (mask & ARCH_PAGE_TABLE_SYNC_MASK) >>>> arch_sync_kernel_mappings(start, start + size); >>>> >>>> And then >>>> >>>> arch/arm/include/asm/page.h:#define ARCH_PAGE_TABLE_SYNC_MASK PGTBL_PMD_MODIFIED >>>> arch/x86/include/asm/pgtable-2level_types.h:#define ARCH_PAGE_TABLE_SYNC_MASK PGTBL_PMD_MODIFIED >>>> arch/x86/include/asm/pgtable-3level_types.h:#define ARCH_PAGE_TABLE_SYNC_MASK PGTBL_PMD_MODIFIED >>>> >>>> >>>> Which makes me wonder why we need PGTBL_PTE_MODIFIED at all? Is there some other check I am missing? >>>> >>>> (same question regarding everything excepy PGTBL_PMD_MODIFIED, because that actually seems to be used) >>> >>> AFAICT it was thought as architecture-specific: >>> >>> /* >>> * Architectures can set this mask to a combination of PGTBL_P?D_MODIFIED values >>> * and let generic vmalloc and ioremap code know when arch_sync_kernel_mappings() >>> * needs to be called. >>> */ >>> #ifndef ARCH_PAGE_TABLE_SYNC_MASK >>> #define ARCH_PAGE_TABLE_SYNC_MASK 0 >>> #endif >>> >>> Not sure if that needs to be addressed at all. >> >> Okay, if there are no users of PGTBL_PTE_MODIFIED we could just ... remove >> it. Dead code. > > As you noticed, PGTBL_PMD_MODIFIED bit is used only. Thus, all other > bits would have to be removed as well, not just PGTBL_PTE_MODIFIED? Likely, yes. > > That is more or less revert of at least the below commits and rewriting > it in a PMD-focused manner: > > 2ba3e6947aed ("mm/vmalloc: track which page-table levels were modified") > d8626138009b ("mm: add functions to track page directory modifications") > > That would be a completely different effort, which I am not aming at ;) Well, I don't think we should be taking this micro-optimization patch here TBH. The real optimization is getting rid of dead code, not optimizing dead code. -- Cheers, David / dhildenb
© 2016 - 2025 Red Hat, Inc.