On Fri, Feb 21, 2025 at 4:05 AM Lorenzo Stoakes <lorenzo.stoakes@xxxxxxxxxx> wrote: > > Currently there is no means by which users can determine whether a given > page in memory is in fact a guard region, that is having had the > MADV_GUARD_INSTALL madvise() flag applied to it. > > This is intentional, as to provide this information in VMA metadata would > contradict the intent of the feature (providing a means to change fault > behaviour at a page table level rather than a VMA level), and would require > VMA metadata operations to scan page tables, which is unacceptable. > > In many cases, users have no need to reflect and determine what regions > have been designated guard regions, as it is the user who has established > them in the first place. > > But in some instances, such as monitoring software, or software that relies > upon being able to ascertain the nature of mappings within a remote process > for instance, it becomes useful to be able to determine which pages have > the guard region marker applied. > > This patch makes use of an unused pagemap bit (58) to provide this > information. > > This patch updates the documentation at the same time as making the change > such that the implementation of the feature and the documentation of it are > tied together. > > Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@xxxxxxxxxx> > --- > Documentation/admin-guide/mm/pagemap.rst | 3 ++- > fs/proc/task_mmu.c | 6 +++++- > 2 files changed, 7 insertions(+), 2 deletions(-) > > diff --git a/Documentation/admin-guide/mm/pagemap.rst b/Documentation/admin-guide/mm/pagemap.rst > index caba0f52dd36..a297e824f990 100644 > --- a/Documentation/admin-guide/mm/pagemap.rst > +++ b/Documentation/admin-guide/mm/pagemap.rst > @@ -21,7 +21,8 @@ There are four components to pagemap: > * Bit 56 page exclusively mapped (since 4.2) > * Bit 57 pte is uffd-wp write-protected (since 5.13) (see > Documentation/admin-guide/mm/userfaultfd.rst) > - * Bits 58-60 zero > + * Bit 58 pte is a guard region (since 6.15) (see madvise (2) man page) Should this be 6.14 ? Other than that: Reviewed-by: Kalesh Singh <kaleshsingh@xxxxxxxxxx> Thanks, Kalesh > + * Bits 59-60 zero > * Bit 61 page is file-page or shared-anon (since 3.5) > * Bit 62 page swapped > * Bit 63 page present > diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c > index f02cd362309a..c17615e21a5d 100644 > --- a/fs/proc/task_mmu.c > +++ b/fs/proc/task_mmu.c > @@ -1632,6 +1632,7 @@ struct pagemapread { > #define PM_SOFT_DIRTY BIT_ULL(55) > #define PM_MMAP_EXCLUSIVE BIT_ULL(56) > #define PM_UFFD_WP BIT_ULL(57) > +#define PM_GUARD_REGION BIT_ULL(58) > #define PM_FILE BIT_ULL(61) > #define PM_SWAP BIT_ULL(62) > #define PM_PRESENT BIT_ULL(63) > @@ -1732,6 +1733,8 @@ static pagemap_entry_t pte_to_pagemap_entry(struct pagemapread *pm, > page = pfn_swap_entry_to_page(entry); > if (pte_marker_entry_uffd_wp(entry)) > flags |= PM_UFFD_WP; > + if (is_guard_swp_entry(entry)) > + flags |= PM_GUARD_REGION; > } > > if (page) { > @@ -1931,7 +1934,8 @@ static const struct mm_walk_ops pagemap_ops = { > * Bit 55 pte is soft-dirty (see Documentation/admin-guide/mm/soft-dirty.rst) > * Bit 56 page exclusively mapped > * Bit 57 pte is uffd-wp write-protected > - * Bits 58-60 zero > + * Bit 58 pte is a guard region > + * Bits 59-60 zero > * Bit 61 page is file-page or shared-anon > * Bit 62 page swapped > * Bit 63 page present > -- > 2.48.1 >