Files
linux/include/linux
Rick Edgecombe 44bd7ace9f mm: take placement mappings gap into account
When memory is being placed, mmap() will take care to respect the guard
gaps of certain types of memory (VM_SHADOWSTACK, VM_GROWSUP and
VM_GROWSDOWN).  In order to ensure guard gaps between mappings, mmap()
needs to consider two things:

 1. That the new mapping isn't placed in an any existing mappings guard
    gaps.
 2. That the new mapping isn't placed such that any existing mappings
    are not in *its* guard gaps.

The longstanding behavior of mmap() is to ensure 1, but not take any care
around 2.  So for example, if there is a PAGE_SIZE free area, and a mmap()
with a PAGE_SIZE size, and a type that has a guard gap is being placed,
mmap() may place the shadow stack in the PAGE_SIZE free area.  Then the
mapping that is supposed to have a guard gap will not have a gap to the
adjacent VMA.

For MAP_GROWSDOWN/VM_GROWSDOWN and MAP_GROWSUP/VM_GROWSUP this has not
been a problem in practice because applications place these kinds of
mappings very early, when there is not many mappings to find a space
between.  But for shadow stacks, they may be placed throughout the
lifetime of the application.

Use the start_gap field to find a space that includes the guard gap for
the new mapping.  Take care to not interfere with the alignment.

Link: https://lkml.kernel.org/r/20240326021656.202649-12-rick.p.edgecombe@intel.com
Signed-off-by: Rick Edgecombe <rick.p.edgecombe@intel.com>
Reviewed-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Aneesh Kumar K.V <aneesh.kumar@kernel.org>
Cc: Borislav Petkov (AMD) <bp@alien8.de>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: Deepak Gupta <debug@rivosinc.com>
Cc: Guo Ren <guoren@kernel.org>
Cc: Helge Deller <deller@gmx.de>
Cc: H. Peter Anvin (Intel) <hpa@zytor.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: "James E.J. Bottomley" <James.Bottomley@HansenPartnership.com>
Cc: Kees Cook <keescook@chromium.org>
Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Cc: Liam R. Howlett <Liam.Howlett@oracle.com>
Cc: Mark Brown <broonie@kernel.org>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Naveen N. Rao <naveen.n.rao@linux.ibm.com>
Cc: Nicholas Piggin <npiggin@gmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
2024-04-25 20:56:28 -07:00
..
2024-03-07 21:52:03 +00:00
2023-10-24 13:08:14 -07:00
2024-01-18 15:21:00 -08:00
2024-04-25 20:55:49 -07:00
2023-08-23 08:21:37 +01:00
2023-09-11 08:13:18 +00:00
2023-12-20 19:26:32 -05:00
2023-10-11 08:46:01 -07:00
2024-03-27 13:17:15 +01:00
2024-03-11 15:37:23 -07:00
2023-12-02 22:24:36 +00:00
2023-12-15 16:25:55 -08:00
2024-03-07 20:37:04 +00:00
2024-02-20 14:22:55 -05:00
2024-02-20 14:22:51 -05:00
2024-03-12 23:08:29 -07:00
2024-02-25 12:05:08 +01:00
2023-12-03 10:28:17 -08:00
2024-01-08 09:36:55 +09:00
2024-04-25 20:55:50 -07:00
2024-04-25 20:55:54 -07:00
2024-03-07 09:36:08 +01:00
2024-02-28 19:36:39 -08:00
2024-03-10 14:38:04 -07:00
2024-02-15 23:43:48 -05:00
2024-04-25 20:55:49 -07:00
2024-02-14 11:14:40 +01:00
2023-12-20 19:26:31 -05:00
2023-12-20 19:26:31 -05:00
2023-10-11 10:11:54 -07:00
2024-02-17 16:20:41 +01:00
2023-10-18 14:43:21 -07:00
2023-10-04 10:41:57 -07:00
2023-12-20 19:26:30 -05:00
2023-10-16 12:44:06 -04:00
2023-10-16 12:44:06 -04:00
2023-08-18 10:18:59 -07:00
2023-10-18 10:01:33 +02:00
2024-03-06 13:04:18 -08:00
2023-11-15 22:41:27 -05:00
2024-03-01 08:44:54 +00:00
2024-03-09 09:14:51 -05:00
2024-03-09 09:14:50 -05:00
2023-12-20 19:26:30 -05:00
2024-03-26 11:07:20 -07:00
2023-11-15 10:15:40 +01:00
2023-12-20 19:26:31 -05:00
2024-03-13 12:53:53 -07:00
2024-03-13 12:53:53 -07:00
2023-12-20 19:26:31 -05:00
2023-12-20 19:26:31 -05:00
2024-01-09 15:00:09 +01:00
2023-12-20 19:26:30 -05:00
2023-12-27 11:49:56 -05:00
2023-08-12 09:18:47 -07:00
2023-10-06 11:01:23 +02:00
2023-12-20 19:26:32 -05:00
2023-12-27 11:49:56 -05:00
2023-12-20 19:26:31 -05:00
2024-03-08 12:05:10 +01:00
2023-12-20 19:26:32 -05:00
2023-12-20 19:26:32 -05:00
2023-12-20 19:26:32 -05:00
2024-02-15 12:17:28 -05:00
2024-03-03 15:06:58 -08:00
2023-12-20 19:26:31 -05:00
2023-10-18 14:43:21 -07:00
2023-08-21 13:37:26 -07:00
2023-12-28 05:02:42 -08:00
2024-02-20 13:36:34 +01:00
2024-03-04 20:46:18 -08:00
2024-03-04 17:25:09 +01:00
2023-12-20 19:26:31 -05:00
2023-08-07 17:55:54 +00:00
2023-08-11 21:12:47 +02:00
2023-12-08 12:02:37 +01:00
2024-02-18 18:59:59 +01:00
2023-12-20 19:26:30 -05:00
2024-03-06 10:52:12 +01:00
2023-08-24 13:27:47 -05:00
2024-02-09 12:07:48 +00:00
2024-04-25 20:55:48 -07:00