https://git.reactos.org/?p=reactos.git;a=commitdiff;h=acdf74aa3b92a49336f413dd524b8840c56bbb84

commit acdf74aa3b92a49336f413dd524b8840c56bbb84
Author:     Pierre Schweitzer <[email protected]>
AuthorDate: Sat Nov 17 15:49:50 2018 +0100
Commit:     Pierre Schweitzer <[email protected]>
CommitDate: Sat Nov 17 16:44:36 2018 +0100

    [NTOSKRNL] Properly align runrefs on SMP in 
ExInitializeRundownProtectionCacheAware()
---
 ntoskrnl/ex/rundown.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/ntoskrnl/ex/rundown.c b/ntoskrnl/ex/rundown.c
index cde0bf7aea..340a2d8832 100644
--- a/ntoskrnl/ex/rundown.c
+++ b/ntoskrnl/ex/rundown.c
@@ -581,7 +581,7 @@ ExInitializeRundownProtectionCacheAware(IN 
PEX_RUNDOWN_REF_CACHE_AWARE RunRefCac
 {
     PVOID Pool;
     PEX_RUNDOWN_REF RunRef;
-    ULONG Count, RunRefSize, Offset;
+    ULONG Count, RunRefSize, Offset, Align;
 
     PAGED_CODE();
 
@@ -601,8 +601,13 @@ ExInitializeRundownProtectionCacheAware(IN 
PEX_RUNDOWN_REF_CACHE_AWARE RunRefCac
     }
     else
     {
-        /* FIXME: Properly align on SMP */
-        UNIMPLEMENTED;
+        /* Get alignment constraint */
+        Align = KeGetRecommendedSharedDataAlignment();
+
+        /* How many runrefs given the alignment? */
+        RunRefSize = Align;
+        Count = ((Size - sizeof(EX_RUNDOWN_REF_CACHE_AWARE)) / Align) - 1;
+        Pool = (PVOID)ALIGN_UP_BY(Pool, Align);
     }
 
     /* Initialize the structure */

Reply via email to