[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 01/13] mm: introduce vma_flags_can_grow() and vma_can_grow()



On Mon Jun 29, 2026 at 3:25 PM EDT, Lorenzo Stoakes wrote:
> These test whether the VMA has stack sematics, i.e. is able to grow upwards
> or downwards depending on the architecture.
>
> In order to account for arches which do not support upward-growing stacks,
> introduce VMA_GROWSUP whose definition depends on the architecture
> supporting it, and use vma_flags_test_single_mask() in vma_flags_can_grow()
> to account for this.
>
> Update the VMA userland tests to reflect the changes
>
> No functional change intended.
>
> Signed-off-by: Lorenzo Stoakes <ljs@xxxxxxxxxx>
> ---
>  include/linux/mm.h              | 21 ++++++++++++++++++---
>  tools/testing/vma/include/dup.h |  4 ++++
>  2 files changed, 22 insertions(+), 3 deletions(-)
>
> diff --git a/include/linux/mm.h b/include/linux/mm.h
> index 868b2334bff3..cf7df1569052 100644
> --- a/include/linux/mm.h
> +++ b/include/linux/mm.h
> @@ -472,6 +472,7 @@ enum {
>  #define VM_SAO               INIT_VM_FLAG(SAO)
>  #elif defined(CONFIG_PARISC)
>  #define VM_GROWSUP   INIT_VM_FLAG(GROWSUP)
> +#define VMA_GROWSUP  mk_vma_flags(VMA_GROWSUP_BIT)
>  #elif defined(CONFIG_SPARC64)
>  #define VM_SPARC_ADI INIT_VM_FLAG(SPARC_ADI)
>  #define VM_ARCH_CLEAR        INIT_VM_FLAG(ARCH_CLEAR)
> @@ -483,6 +484,7 @@ enum {
>  #endif
>  #ifndef VM_GROWSUP
>  #define VM_GROWSUP   VM_NONE
> +#define VMA_GROWSUP  EMPTY_VMA_FLAGS
>  #endif
>  #ifdef CONFIG_ARM64_MTE
>  #define VM_MTE               INIT_VM_FLAG(MTE)
> @@ -1563,11 +1565,24 @@ static inline bool vma_is_initial_stack(const struct 
> vm_area_struct *vma)
>               vma->vm_end >= vma->vm_mm->start_stack;
>  }
>  
> -static inline bool vma_is_temporary_stack(const struct vm_area_struct *vma)
> +static inline bool vma_flags_can_grow(const vma_flags_t *flags)
>  {
> -     int maybe_stack = vma->vm_flags & (VM_GROWSDOWN | VM_GROWSUP);
> +     if (vma_flags_test_single_mask(flags, VMA_GROWSUP))
> +             return true;
> +     if (vma_flags_test(flags, VMA_GROWSDOWN_BIT))
> +             return true;
> +
> +     return false;
> +}
>  
> -     if (!maybe_stack)
> +static inline bool vma_can_grow(const struct vm_area_struct *vma)
> +{
> +     return vma_flags_can_grow(&vma->flags);

Would it save vma_flags_can_grow() if we do below?

return vma_test(vma, VMA_GROWSDOWN_BIT) || vma_test_single_mask(vma, 
VMA_GROWSUP);

I find these two functions when I am reading mm.h.

> +}
> +
> +static inline bool vma_is_temporary_stack(const struct vm_area_struct *vma)
> +{
> +     if (!vma_can_grow(vma))
>               return false;
>  
>       if ((vma->vm_flags & VM_STACK_INCOMPLETE_SETUP) ==
> diff --git a/tools/testing/vma/include/dup.h b/tools/testing/vma/include/dup.h
> index 5d7d0afd7765..6f5bcd7fbcd8 100644
> --- a/tools/testing/vma/include/dup.h
> +++ b/tools/testing/vma/include/dup.h
> @@ -245,8 +245,10 @@ enum {
>  #define VM_STACK     INIT_VM_FLAG(STACK)
>  #ifdef CONFIG_STACK_GROWS_UP
>  #define VM_STACK_EARLY       INIT_VM_FLAG(STACK_EARLY)
> +#define VMA_STACK_EARLY mk_vma_flags(VMA_STACK_EARLY_BIT)
>  #else
>  #define VM_STACK_EARLY       VM_NONE
> +#define VMA_STACK_EARLY EMPTY_VMA_FLAGS
>  #endif
>  #ifdef CONFIG_ARCH_HAS_PKEYS
>  #define VM_PKEY_SHIFT ((__force int)VMA_HIGH_ARCH_0_BIT)
> @@ -315,6 +317,8 @@ enum {
>  
>  /* Bits set in the VMA until the stack is in its final location */
>  #define VM_STACK_INCOMPLETE_SETUP (VM_RAND_READ | VM_SEQ_READ | 
> VM_STACK_EARLY)
> +#define VMA_STACK_INCOMPLETE_SETUP append_vma_flags(         \
> +     VMA_STACK_EARLY, VMA_RAND_READ_BIT, VMA_SEQ_READ_BIT)
>  
>  #define TASK_EXEC_BIT ((current->personality & READ_IMPLIES_EXEC) ? \
>                      VM_EXEC_BIT : VM_READ_BIT)

Why are VMA_STACK_EARLY and VMA_STACK_INCOMPLETE_SETUP added here but
not in mm.h?


-- 
Best Regards,
Yan, Zi




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.