On Thu, Apr 15, 2021 at 03:14:07PM -0700, Yu-cheng Yu wrote: > Account shadow stack pages to stack memory. > > Signed-off-by: Yu-cheng Yu <yu-cheng.yu@xxxxxxxxx> > Cc: Kees Cook <keescook@xxxxxxxxxxxx> > Cc: Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx> > --- > v25: > - Remove #ifdef CONFIG_ARCH_HAS_SHADOW_STACK for is_shadow_stack_mapping(). > v24: > - Change arch_shadow_stack_mapping() to is_shadow_stack_mapping(). > - Change VM_SHSTK to VM_SHADOW_STACK. > > arch/x86/include/asm/pgtable.h | 3 +++ > arch/x86/mm/pgtable.c | 5 +++++ > include/linux/pgtable.h | 9 +++++++++ > mm/mmap.c | 5 +++++ > 4 files changed, 22 insertions(+) > > diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h > index da5dea417663..7f324edaedfa 100644 > --- a/arch/x86/include/asm/pgtable.h > +++ b/arch/x86/include/asm/pgtable.h > @@ -1692,6 +1692,9 @@ static inline bool arch_faults_on_old_pte(void) > #define maybe_mkwrite maybe_mkwrite > extern pte_t maybe_mkwrite(pte_t pte, struct vm_area_struct *vma); > > +#define is_shadow_stack_mapping is_shadow_stack_mapping > +extern bool is_shadow_stack_mapping(vm_flags_t vm_flags); > + > #endif /* __ASSEMBLY__ */ > > #endif /* _ASM_X86_PGTABLE_H */ > diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c > index e778dbbef3d8..69c0ef583c55 100644 > --- a/arch/x86/mm/pgtable.c > +++ b/arch/x86/mm/pgtable.c > @@ -897,3 +897,8 @@ int pmd_free_pte_page(pmd_t *pmd, unsigned long addr) > > #endif /* CONFIG_X86_64 */ > #endif /* CONFIG_HAVE_ARCH_HUGE_VMAP */ > + > +bool is_shadow_stack_mapping(vm_flags_t vm_flags) > +{ > + return (vm_flags & VM_SHADOW_STACK); Nit: parentheses are redundant. > +} > diff --git a/include/linux/pgtable.h b/include/linux/pgtable.h > index 5e772392a379..45b601fa1a1c 100644 > --- a/include/linux/pgtable.h > +++ b/include/linux/pgtable.h > @@ -1446,6 +1446,15 @@ static inline bool arch_has_pfn_modify_check(void) > } > #endif /* !_HAVE_ARCH_PFN_MODIFY_ALLOWED */ > > +#ifdef CONFIG_MMU > +#ifndef is_shadow_stack_mapping > +static inline bool is_shadow_stack_mapping(vm_flags_t vm_flags) > +{ > + return false; > +} > +#endif > +#endif /* CONFIG_MMU */ What the purpose #ifdef CONFIG_MMU? Looks redundant. Otherwise: Reviewed-by: Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx> > + > /* > * Architecture PAGE_KERNEL_* fallbacks > * > diff --git a/mm/mmap.c b/mm/mmap.c > index 3f287599a7a3..d77fb39b6ab5 100644 > --- a/mm/mmap.c > +++ b/mm/mmap.c > @@ -1718,6 +1718,9 @@ static inline int accountable_mapping(struct file *file, vm_flags_t vm_flags) > if (file && is_file_hugepages(file)) > return 0; > > + if (is_shadow_stack_mapping(vm_flags)) > + return 1; > + > return (vm_flags & (VM_NORESERVE | VM_SHARED | VM_WRITE)) == VM_WRITE; > } > > @@ -3387,6 +3390,8 @@ void vm_stat_account(struct mm_struct *mm, vm_flags_t flags, long npages) > mm->stack_vm += npages; > else if (is_data_mapping(flags)) > mm->data_vm += npages; > + else if (is_shadow_stack_mapping(flags)) > + mm->stack_vm += npages; > } > > static vm_fault_t special_mapping_fault(struct vm_fault *vmf); > -- > 2.21.0 > > -- Kirill A. Shutemov