lkml.org 
[lkml]   [2021]   [Apr]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH v25 18/30] mm/mmap: Add shadow stack pages to memory accounting
    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@intel.com>
    > Cc: Kees Cook <keescook@chromium.org>
    > Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    > ---
    > 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@linux.intel.com>

    > +
    > /*
    > * 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

    \
     
     \ /
      Last update: 2021-04-23 12:19    [W:2.408 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site