On 07.11.25 17:11, Lorenzo Stoakes wrote:
Currently, if a user needs to determine if guard regions are present in a
range, they have to scan all VMAs (or have knowledge of which ones might
have guard regions).

Since commit 8e2f2aeb8b48 ("fs/proc/task_mmu: add guard region bit to
pagemap") and the related commit a516403787e0 ("fs/proc: extend the
PAGEMAP_SCAN ioctl to report guard regions"), users can use either
/proc/$pid/pagemap or the PAGEMAP_SCAN functionality to perform this
operation at a virtual address level.

This is not ideal, and it gives no visibility at a /proc/$pid/smaps level
that guard regions exist in ranges.

This patch remedies the situation by establishing a new VMA flag,
VM_MAYBE_GUARD, to indicate that a VMA may contain guard regions (it is
uncertain because we cannot reasonably determine whether a
MADV_GUARD_REMOVE call has removed all of the guard regions in a VMA, and
additionally VMAs may change across merge/split).

We utilise 0x800 for this flag which makes it available to 32-bit
architectures also, a flag that was previously used by VM_DENYWRITE, which
was removed in commit 8d0920bde5eb ("mm: remove VM_DENYWRITE") and hasn't
bee reused yet.

We also update the smaps logic and documentation to identify these VMAs.

Another major use of this functionality is that we can use it to identify
that we ought to copy page tables on fork.

We do not actually implement usage of this flag in mm/madvise.c yet as we
need to allow some VMA flags to be applied atomically under mmap/VMA read
lock in order to avoid the need to acquire a write lock for this purpose.

Reviewed-by: Pedro Falcato <[email protected]>
Reviewed-by: Vlastimil Babka <[email protected]>
Signed-off-by: Lorenzo Stoakes <[email protected]>
---
  Documentation/filesystems/proc.rst | 5 +++--
  fs/proc/task_mmu.c                 | 1 +
  include/linux/mm.h                 | 3 +++
  include/trace/events/mmflags.h     | 1 +
  mm/memory.c                        | 4 ++++
  tools/testing/vma/vma_internal.h   | 1 +
  6 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/Documentation/filesystems/proc.rst 
b/Documentation/filesystems/proc.rst
index 0b86a8022fa1..8256e857e2d7 100644
--- a/Documentation/filesystems/proc.rst
+++ b/Documentation/filesystems/proc.rst
@@ -553,7 +553,7 @@ otherwise.
  kernel flags associated with the particular virtual memory area in two letter
  encoded manner. The codes are the following:
- == =======================================
+    ==    =============================================================
      rd    readable
      wr    writeable
      ex    executable
@@ -591,7 +591,8 @@ encoded manner. The codes are the following:
      sl    sealed
      lf    lock on fault pages
      dp    always lazily freeable mapping
-    ==    =======================================
+    gu    maybe contains guard regions (if not set, definitely doesn't)
+    ==    =============================================================


In general LGTM, BUT in the context of this patch where the flag is never set, that's not entirely correct ;) It made sense after staring at patch #5.

Acked-by: David Hildenbrand (Red Hat) <[email protected]>

--
Cheers

David

Reply via email to