<div dir="ltr">From 275d93c9ab0f533fa70d698726afc8adaaefb664 Mon Sep 17 00:00:00 2001<br>From: Adeniyi Mayokun <<a href="mailto:adeniyimayokun17@gmail.com">adeniyimayokun17@gmail.com</a>><br>Date: Wed, 14 Mar 2018 06:30:20 +0100<br>Subject: [PATCH] ntdll/heap.c: align everything to 64 byte to reduce<br> false-sharing issues.<br><br>Signed-off-by: Adeniyi Mayokun <adeniyimayokun17@gmail.com@<a href="http://gmail.com">gmail.com</a>><br>---<br> dlls/ntdll/heap.c | 29 ++++++++++++++++-------------<br> 1 file changed, 16 insertions(+), 13 deletions(-)<br><br>diff --git a/dlls/ntdll/heap.c b/dlls/ntdll/heap.c<br>index e0ffdfec99..d59f3c8414 100644<br>--- a/dlls/ntdll/heap.c<br>+++ b/dlls/ntdll/heap.c<br>@@ -90,24 +90,27 @@ typedef struct<br> #define ARENA_TAIL_FILLER      0xab<br> #define ARENA_FREE_FILLER      0xfeeefeee<br> <br>-/* everything is aligned on 8 byte boundaries (16 for Win64) */<br>-#define ALIGNMENT              (2*sizeof(void*))<br>+/* everything is aligned on 64 byte boundaries */<br>+#define ALIGNMENT              64<br> #define LARGE_ALIGNMENT        16  /* large blocks have stricter alignment */<br>-#define ARENA_OFFSET           (ALIGNMENT - sizeof(ARENA_INUSE))<br> <br> C_ASSERT( sizeof(ARENA_LARGE) % LARGE_ALIGNMENT == 0 );<br> <br>-#define ROUND_SIZE(size)       ((((size) + ALIGNMENT - 1) & ~(ALIGNMENT-1)) + ARENA_OFFSET)<br>+#define ROUND_SIZE(size)       ((size + ALIGNMENT - 1) & ~(ALIGNMENT - 1))<br>+#define ROUND_DATA_SIZE(size)  (((size + sizeof(ARENA_INUSE) + ALIGNMENT - 1) \<br>+                                  & ~(ALIGNMENT - 1)) - sizeof(ARENA_INUSE))<br> <br> #define QUIET                  1           /* Suppress messages  */<br> #define NOISY                  0           /* Report all errors  */<br> <br>+/* minimum size of a block with arena */<br>+#define HEAP_MIN_BLOCK_SIZE   ROUND_SIZE(max(sizeof(ARENA_FREE) + sizeof(ARENA_FREE*),\<br>+                                             sizeof(ARENA_INUSE)))<br> /* minimum data size (without arenas) of an allocated block */<br>-/* make sure that it's larger than a free list entry */<br>-#define HEAP_MIN_DATA_SIZE    ROUND_SIZE(2 * sizeof(struct list))<br>+#define HEAP_MIN_DATA_SIZE    HEAP_MIN_BLOCK_SIZE - sizeof(ARENA_INUSE)<br> /* minimum size by which an allocated block must be shrunk */<br> /* must be enough to fit the free block that will be created after it */<br>-#define HEAP_MIN_SHRINK_SIZE  (HEAP_MIN_DATA_SIZE+sizeof(ARENA_FREE))<br>+#define HEAP_MIN_SHRINK_SIZE  HEAP_MIN_BLOCK_SIZE<br> /* minimum size to start allocating large blocks */<br> #define HEAP_MIN_LARGE_BLOCK_SIZE  0x7f000<br> /* extra size to add at the end of block for tail checking */<br>@@ -1316,7 +1319,7 @@ grow:<br>         return NULL;<br>     }<br> <br>-    total_size = size + ROUND_SIZE(sizeof(SUBHEAP)) + sizeof(ARENA_INUSE);<br>+    total_size = size + ROUND_SIZE(sizeof(SUBHEAP) + sizeof(ARENA_INUSE));<br>     if (total_size < size) return NULL;  /* overflow */<br> <br>     if ((subheap = HEAP_CreateSubHeap( heap, NULL, heap->flags, total_size,<br>@@ -1369,7 +1372,7 @@ static BOOL HEAP_ValidateFreeArena( SUBHEAP *subheap, ARENA_FREE *pArena )<br>     char *heapEnd = (char *)subheap->base + subheap->size;<br> <br>     /* Check for unaligned pointers */<br>-    if ((ULONG_PTR)pArena % ALIGNMENT != ARENA_OFFSET)<br>+    if ((ULONG_PTR)pArena % ALIGNMENT != 0)<br>     {<br>         ERR("Heap %p: unaligned arena pointer %p\n", subheap->heap, pArena );<br>         return FALSE;<br>@@ -1478,7 +1481,7 @@ static BOOL HEAP_ValidateInUseArena( const SUBHEAP *subheap, const ARENA_INUSE *<br>     const char *heapEnd = (const char *)subheap->base + subheap->size;<br> <br>     /* Check for unaligned pointers */<br>-    if ((ULONG_PTR)pArena % ALIGNMENT != ARENA_OFFSET)<br>+    if ((ULONG_PTR)pArena % ALIGNMENT != 0)<br>     {<br>         if ( quiet == NOISY )<br>         {<br>@@ -1709,7 +1712,7 @@ static BOOL validate_block_pointer( HEAP *heap, SUBHEAP **ret_subheap, const ARE<br>         WARN( "Heap %p: pointer %p is inside subheap %p header\n", subheap->heap, arena + 1, subheap );<br>     else if (subheap->heap->flags & HEAP_VALIDATE)  /* do the full validation */<br>         ret = HEAP_ValidateInUseArena( subheap, arena, QUIET );<br>-    else if ((ULONG_PTR)arena % ALIGNMENT != ARENA_OFFSET)<br>+    else if ((ULONG_PTR)arena % ALIGNMENT != 0)<br>         WARN( "Heap %p: unaligned arena pointer %p\n", subheap->heap, arena );<br>     else if (arena->magic == ARENA_PENDING_MAGIC)<br>         WARN( "Heap %p: block %p used after free\n", subheap->heap, arena + 1 );<br>@@ -1957,7 +1960,7 @@ PVOID WINAPI RtlAllocateHeap( HANDLE heap, ULONG flags, SIZE_T size )<br>     if (!heapPtr) return NULL;<br>     flags &= HEAP_GENERATE_EXCEPTIONS | HEAP_NO_SERIALIZE | HEAP_ZERO_MEMORY;<br>     flags |= heapPtr->flags;<br>-    rounded_size = ROUND_SIZE(size) + HEAP_TAIL_EXTRA_SIZE( flags );<br>+    rounded_size = ROUND_DATA_SIZE(size) + HEAP_TAIL_EXTRA_SIZE( flags );<br>     if (rounded_size < size)  /* overflow */<br>     {<br>         if (flags & HEAP_GENERATE_EXCEPTIONS) RtlRaiseStatus( STATUS_NO_MEMORY );<br>@@ -2110,7 +2113,7 @@ PVOID WINAPI RtlReAllocateHeap( HANDLE heap, ULONG flags, PVOID ptr, SIZE_T size<br>     flags |= heapPtr->flags;<br>     if (!(flags & HEAP_NO_SERIALIZE)) RtlEnterCriticalSection( &heapPtr->critSection );<br> <br>-    rounded_size = ROUND_SIZE(size) + HEAP_TAIL_EXTRA_SIZE(flags);<br>+    rounded_size = ROUND_DATA_SIZE(size) + HEAP_TAIL_EXTRA_SIZE(flags);<br>     if (rounded_size < size) goto oom;  /* overflow */<br>     if (rounded_size < HEAP_MIN_DATA_SIZE) rounded_size = HEAP_MIN_DATA_SIZE;<br> <br>-- <br>2.14.1<br><br><br></div>