Re: [PATCH v7 22/41] mm/mmap: Add shadow stack pages to memory accounting

From: Deepak Gupta
Date: Fri Mar 17 2023 - 13:12:40 EST


On Mon, Feb 27, 2023 at 2:31 PM Rick Edgecombe
<rick.p.edgecombe@xxxxxxxxx> wrote:
>
> From: Yu-cheng Yu <yu-cheng.yu@xxxxxxxxx>
>
> The x86 Control-flow Enforcement Technology (CET) feature includes a new
> type of memory called shadow stack. This shadow stack memory has some
> unusual properties, which requires some core mm changes to function
> properly.
>
> Account shadow stack pages to stack memory. Do this by adding a
> VM_SHADOW_STACK check in is_stack_mapping().
>
> Tested-by: Pengfei Xu <pengfei.xu@xxxxxxxxx>
> Tested-by: John Allen <john.allen@xxxxxxx>
> Tested-by: Kees Cook <keescook@xxxxxxxxxxxx>
> Acked-by: Mike Rapoport (IBM) <rppt@xxxxxxxxxx>
> Reviewed-by: Kees Cook <keescook@xxxxxxxxxxxx>
> Signed-off-by: Yu-cheng Yu <yu-cheng.yu@xxxxxxxxx>
> Co-developed-by: Rick Edgecombe <rick.p.edgecombe@xxxxxxxxx>
> Signed-off-by: Rick Edgecombe <rick.p.edgecombe@xxxxxxxxx>
> Cc: Kees Cook <keescook@xxxxxxxxxxxx>
>
> ---
> v7:
> - Change is_stack_mapping() to know about VM_SHADOW_STACK so the
> additions in vm_stat_account() can be dropped. (David Hildenbrand)
>
> v3:
> - Remove unneeded VM_SHADOW_STACK check in accountable_mapping()
> (Kirill)
>
> v2:
> - Remove is_shadow_stack_mapping() and just change it to directly bitwise
> and VM_SHADOW_STACK.
>
> Yu-cheng v26:
> - Remove redundant #ifdef CONFIG_MMU.
>
> Yu-cheng v25:
> - Remove #ifdef CONFIG_ARCH_HAS_SHADOW_STACK for is_shadow_stack_mapping().
> ---
> mm/internal.h | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/mm/internal.h b/mm/internal.h
> index 7920a8b7982e..1d13d5580f64 100644
> --- a/mm/internal.h
> +++ b/mm/internal.h
> @@ -491,14 +491,14 @@ static inline bool is_exec_mapping(vm_flags_t flags)
> }
>
> /*
> - * Stack area - automatically grows in one direction
> + * Stack area
> *
> - * VM_GROWSUP / VM_GROWSDOWN VMAs are always private anonymous:
> - * do_mmap() forbids all other combinations.
> + * VM_GROWSUP, VM_GROWSDOWN VMAs are always private
> + * anonymous. do_mmap() forbids all other combinations.
> */
> static inline bool is_stack_mapping(vm_flags_t flags)
> {
> - return (flags & VM_STACK) == VM_STACK;
> + return ((flags & VM_STACK) == VM_STACK) || (flags & VM_SHADOW_STACK);

Same comment here. `VM_SHADOW_STACK` is an x86 specific way of
encoding a shadow stack.
Instead let's have a proxy here which allows architectures to have
their own encodings to represent a shadow stack.

> }
>
> /*
> --
> 2.17.1
>