Thread (66 messages) 66 messages, 5 authors, 2021-03-29

Re: [PATCH v23 18/28] mm/mmap: Add shadow stack pages to memory accounting

From: Kirill A. Shutemov <hidden>
Date: 2021-03-29 10:11:41
Also in: linux-arch, linux-doc, linux-mm, lkml

On Fri, Mar 26, 2021 at 08:46:30AM -0700, Yu, Yu-cheng wrote:
On 3/22/2021 3:57 AM, Kirill A. Shutemov wrote:
quoted
On Tue, Mar 16, 2021 at 08:10:44AM -0700, Yu-cheng Yu wrote:
quoted
Account shadow stack pages to stack memory.

Signed-off-by: Yu-cheng Yu <redacted>
Reviewed-by: Kees Cook <redacted>
---
  arch/x86/mm/pgtable.c   |  7 +++++++
  include/linux/pgtable.h | 11 +++++++++++
  mm/mmap.c               |  5 +++++
  3 files changed, 23 insertions(+)
diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c
index 0f4fbf51a9fc..948d28c29964 100644
--- a/arch/x86/mm/pgtable.c
+++ b/arch/x86/mm/pgtable.c
@@ -895,3 +895,10 @@ int pmd_free_pte_page(pmd_t *pmd, unsigned long addr)
  #endif /* CONFIG_X86_64 */
  #endif	/* CONFIG_HAVE_ARCH_HUGE_VMAP */
+
+#ifdef CONFIG_ARCH_HAS_SHADOW_STACK
+bool arch_shadow_stack_mapping(vm_flags_t vm_flags)
+{
+	return (vm_flags & VM_SHSTK);
+}
+#endif
diff --git a/include/linux/pgtable.h b/include/linux/pgtable.h
index cbd98484c4f1..487c08df4365 100644
--- a/include/linux/pgtable.h
+++ b/include/linux/pgtable.h
@@ -1470,6 +1470,17 @@ static inline pmd_t arch_maybe_pmd_mkwrite(pmd_t pmd, struct vm_area_struct *vma
  #endif /* CONFIG_ARCH_MAYBE_MKWRITE */
  #endif /* CONFIG_MMU */
+#ifdef CONFIG_MMU
+#ifdef CONFIG_ARCH_HAS_SHADOW_STACK
+bool arch_shadow_stack_mapping(vm_flags_t vm_flags);
+#else
+static inline bool arch_shadow_stack_mapping(vm_flags_t vm_flags)
+{
+	return false;
+}
+#endif /* CONFIG_ARCH_HAS_SHADOW_STACK */
+#endif /* CONFIG_MMU */
+
  /*
   * Architecture PAGE_KERNEL_* fallbacks
   *
diff --git a/mm/mmap.c b/mm/mmap.c
index 3f287599a7a3..2ac67882ace2 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 (arch_shadow_stack_mapping(vm_flags))
+		return 1;
+
What's wrong with testing (vm_flags & VM_SHSTK) here? VM_SHSTK is 0 on
non-x86.
quoted
  	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 (arch_shadow_stack_mapping(flags))
+		mm->stack_vm += npages;
Ditto.
The thought was, here all testings are done with helpers, e.g.
is_data_mapping(), so creating a helper for shadow stack is more inline with
the existing code.  Or, maybe we can call it is_shadow_stack_mapping()?
And, since we have a helper, use it in accountable_mapping() as well.  Or do
you have other suggestions?
is_shadow_stack_mapping() sounds reasonable.

My point is that we already have ifdef around #define VM_SHSTK. No need in
duplicating it for helper.

-- 
 Kirill A. Shutemov
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help