In preparation for patch 6 and modularizing the code in general, split
can_change_pte_writable() into private and shared VMA parts. No functional
change intended.
Suggested-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Signed-off-by: Dev Jain <dev.jain@arm.com>
---
mm/mprotect.c | 50 ++++++++++++++++++++++++++++++++++++--------------
1 file changed, 36 insertions(+), 14 deletions(-)
diff --git a/mm/mprotect.c b/mm/mprotect.c
index 4977f198168e..a1c7d8a4648d 100644
--- a/mm/mprotect.c
+++ b/mm/mprotect.c
@@ -40,11 +40,8 @@
#include "internal.h"
-bool can_change_pte_writable(struct vm_area_struct *vma, unsigned long addr,
- pte_t pte)
+static bool maybe_change_pte_writable(struct vm_area_struct *vma, pte_t pte)
{
- struct page *page;
-
if (WARN_ON_ONCE(!(vma->vm_flags & VM_WRITE)))
return false;
@@ -60,16 +57,32 @@ bool can_change_pte_writable(struct vm_area_struct *vma, unsigned long addr,
if (userfaultfd_pte_wp(vma, pte))
return false;
- if (!(vma->vm_flags & VM_SHARED)) {
- /*
- * Writable MAP_PRIVATE mapping: We can only special-case on
- * exclusive anonymous pages, because we know that our
- * write-fault handler similarly would map them writable without
- * any additional checks while holding the PT lock.
- */
- page = vm_normal_page(vma, addr, pte);
- return page && PageAnon(page) && PageAnonExclusive(page);
- }
+ return true;
+}
+
+static bool can_change_private_pte_writable(struct vm_area_struct *vma,
+ unsigned long addr, pte_t pte)
+{
+ struct page *page;
+
+ if (!maybe_change_pte_writable(vma, pte))
+ return false;
+
+ /*
+ * Writable MAP_PRIVATE mapping: We can only special-case on
+ * exclusive anonymous pages, because we know that our
+ * write-fault handler similarly would map them writable without
+ * any additional checks while holding the PT lock.
+ */
+ page = vm_normal_page(vma, addr, pte);
+ return page && PageAnon(page) && PageAnonExclusive(page);
+}
+
+static bool can_change_shared_pte_writable(struct vm_area_struct *vma,
+ pte_t pte)
+{
+ if (!maybe_change_pte_writable(vma, pte))
+ return false;
VM_WARN_ON_ONCE(is_zero_pfn(pte_pfn(pte)) && pte_dirty(pte));
@@ -83,6 +96,15 @@ bool can_change_pte_writable(struct vm_area_struct *vma, unsigned long addr,
return pte_dirty(pte);
}
+bool can_change_pte_writable(struct vm_area_struct *vma, unsigned long addr,
+ pte_t pte)
+{
+ if (!(vma->vm_flags & VM_SHARED))
+ return can_change_private_pte_writable(vma, addr, pte);
+
+ return can_change_shared_pte_writable(vma, pte);
+}
+
static int mprotect_folio_pte_batch(struct folio *folio, pte_t *ptep,
pte_t pte, int max_nr_ptes)
{
--
2.30.2
On 18 Jul 2025, at 5:02, Dev Jain wrote: > In preparation for patch 6 and modularizing the code in general, split > can_change_pte_writable() into private and shared VMA parts. No functional > change intended. > > Suggested-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> > Signed-off-by: Dev Jain <dev.jain@arm.com> > --- > mm/mprotect.c | 50 ++++++++++++++++++++++++++++++++++++-------------- > 1 file changed, 36 insertions(+), 14 deletions(-) > LGTM. Reviewed-by: Zi Yan <ziy@nvidia.com> Best Regards, Yan, Zi
On Fri, Jul 18, 2025 at 02:32:42PM +0530, Dev Jain wrote: > In preparation for patch 6 and modularizing the code in general, split > can_change_pte_writable() into private and shared VMA parts. No functional > change intended. > > Suggested-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> > Signed-off-by: Dev Jain <dev.jain@arm.com> Great thanks! This is much clearer I think (of course being the Suggested-by here makes me somewhat biased :P) :>) LGTM, so: Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> > --- > mm/mprotect.c | 50 ++++++++++++++++++++++++++++++++++++-------------- > 1 file changed, 36 insertions(+), 14 deletions(-) > > diff --git a/mm/mprotect.c b/mm/mprotect.c > index 4977f198168e..a1c7d8a4648d 100644 > --- a/mm/mprotect.c > +++ b/mm/mprotect.c > @@ -40,11 +40,8 @@ > > #include "internal.h" > > -bool can_change_pte_writable(struct vm_area_struct *vma, unsigned long addr, > - pte_t pte) > +static bool maybe_change_pte_writable(struct vm_area_struct *vma, pte_t pte) > { > - struct page *page; > - > if (WARN_ON_ONCE(!(vma->vm_flags & VM_WRITE))) > return false; > > @@ -60,16 +57,32 @@ bool can_change_pte_writable(struct vm_area_struct *vma, unsigned long addr, > if (userfaultfd_pte_wp(vma, pte)) > return false; > > - if (!(vma->vm_flags & VM_SHARED)) { > - /* > - * Writable MAP_PRIVATE mapping: We can only special-case on > - * exclusive anonymous pages, because we know that our > - * write-fault handler similarly would map them writable without > - * any additional checks while holding the PT lock. > - */ > - page = vm_normal_page(vma, addr, pte); > - return page && PageAnon(page) && PageAnonExclusive(page); > - } > + return true; > +} > + > +static bool can_change_private_pte_writable(struct vm_area_struct *vma, > + unsigned long addr, pte_t pte) > +{ > + struct page *page; > + > + if (!maybe_change_pte_writable(vma, pte)) > + return false; > + > + /* > + * Writable MAP_PRIVATE mapping: We can only special-case on > + * exclusive anonymous pages, because we know that our > + * write-fault handler similarly would map them writable without > + * any additional checks while holding the PT lock. > + */ > + page = vm_normal_page(vma, addr, pte); > + return page && PageAnon(page) && PageAnonExclusive(page); > +} > + > +static bool can_change_shared_pte_writable(struct vm_area_struct *vma, > + pte_t pte) > +{ > + if (!maybe_change_pte_writable(vma, pte)) > + return false; > > VM_WARN_ON_ONCE(is_zero_pfn(pte_pfn(pte)) && pte_dirty(pte)); > > @@ -83,6 +96,15 @@ bool can_change_pte_writable(struct vm_area_struct *vma, unsigned long addr, > return pte_dirty(pte); > } > > +bool can_change_pte_writable(struct vm_area_struct *vma, unsigned long addr, > + pte_t pte) > +{ > + if (!(vma->vm_flags & VM_SHARED)) > + return can_change_private_pte_writable(vma, addr, pte); > + > + return can_change_shared_pte_writable(vma, pte); > +} > + > static int mprotect_folio_pte_batch(struct folio *folio, pte_t *ptep, > pte_t pte, int max_nr_ptes) > { > -- > 2.30.2 >
© 2016 - 2025 Red Hat, Inc.