Re: [PATCH 01/13] mm: introduce vma_flags_can_grow() and vma_can_grow()
"Zi Yan" <[email protected]> Tue, 30 Jun 2026 11:09:56 -0400
| Newsgroups | gmane.comp.freedesktop.xorg.drivers.intel,gmane.linux.ports.mips,gmane.linux.kernel,gmane.linux.ports.ppc64.devel,gmane.comp.video.dri.devel,gmane.linux.ports.arm.kernel,gmane.linux.kernel.samsung-soc,gmane.linux.ports.arm.msm,gmane.comp.freedesktop.xorg.drivers.freedreno,gmane.comp.freedesktop.xorg.nouveau,gmane.linux.ports.arm.rockchip,gmane.linux.ports.tegra,gmane.comp.emulators.xen.devel,gmane.linux.kernel.aio.general,gmane.linux.file-systems,gmane.linux.kernel.mm,gmane.linux.sound |
|---|---|
| Message-ID | <[email protected]> |
On Tue Jun 30, 2026 at 3:38 AM EDT, Lorenzo Stoakes wrote: > On Mon, Jun 29, 2026 at 04:26:18PM -0400, Zi Yan wrote: >> 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 <[email protected]> >> > --- >> > 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. > > Yeah but we require vma_flags_can_grow() for code in mmap.c, the majority of > checks of this have only vma_flags_t to work with not a VMA :) > Got it. I think I need to finish this series. :) >> >> > +} >> > + >> > +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? > > Yeah urgh oops my bad. It doesn't really break anything but I'll fix it if a > respin is needed... Sure. -- Best Regards, Yan, Zi