diff --git a/ntoskrnl/ex/rundown.c b/ntoskrnl/ex/rundown.c index bdbca4904eb..95ca8afbf54 100644 --- a/ntoskrnl/ex/rundown.c +++ b/ntoskrnl/ex/rundown.c @@ -387,7 +387,7 @@ ExfAcquireRundownProtectionCacheAware(IN PEX_RUNDOWN_REF_CACHE_AWARE RunRefCache { PEX_RUNDOWN_REF RunRef; - RunRef = ExGetRunRefForCurrentProcessor(RunRefCacheAware); + RunRef = ExGetRunRefForGivenProcessor(RunRefCacheAware, KeGetCurrentProcessorNumber()); return _ExAcquireRundownProtection(RunRef); } @@ -401,7 +401,7 @@ ExfAcquireRundownProtectionCacheAwareEx(IN PEX_RUNDOWN_REF_CACHE_AWARE RunRefCac { PEX_RUNDOWN_REF RunRef; - RunRef = ExGetRunRefForCurrentProcessor(RunRefCacheAware); + RunRef = ExGetRunRefForGivenProcessor(RunRefCacheAware, KeGetCurrentProcessorNumber()); return ExfAcquireRundownProtectionEx(RunRef, Count); } @@ -414,7 +414,7 @@ ExfReleaseRundownProtectionCacheAware(IN PEX_RUNDOWN_REF_CACHE_AWARE RunRefCache { PEX_RUNDOWN_REF RunRef; - RunRef = ExGetRunRefForCurrentProcessor(RunRefCacheAware); + RunRef = ExGetRunRefForGivenProcessor(RunRefCacheAware, KeGetCurrentProcessorNumber()); return _ExReleaseRundownProtection(RunRef); } @@ -428,7 +428,7 @@ ExfReleaseRundownProtectionCacheAwareEx(IN PEX_RUNDOWN_REF_CACHE_AWARE RunRefCac { PEX_RUNDOWN_REF RunRef; - RunRef = ExGetRunRefForCurrentProcessor(RunRefCacheAware); + RunRef = ExGetRunRefForGivenProcessor(RunRefCacheAware, KeGetCurrentProcessorNumber()); return ExfReleaseRundownProtectionEx(RunRef, Count); } @@ -459,10 +459,7 @@ ExfWaitForRundownProtectionReleaseCacheAware(IN PEX_RUNDOWN_REF_CACHE_AWARE RunR for (Current = 0; Current < ProcCount; ++Current) { /* Get the runref for the proc */ - RunRef = (PEX_RUNDOWN_REF)((ULONG_PTR)RunRefCacheAware->RunRefs + - RunRefCacheAware->RunRefSize * - (Current % RunRefCacheAware->Number)); - + RunRef = ExGetRunRefForGivenProcessor(RunRefCacheAware, Current); /* Loop for setting the wait block */ do { @@ -535,7 +532,7 @@ ExAllocateCacheAwareRundownProtection(IN POOL_TYPE PoolType, { PEX_RUNDOWN_REF RunRef; PVOID PoolToFree, RunRefs; - ULONG RunRefSize, Count, Offset, Align; + ULONG RunRefSize, Count, Align; PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware; PAGED_CODE(); @@ -601,8 +598,7 @@ ExAllocateCacheAwareRundownProtection(IN POOL_TYPE PoolType, { for (Count = 0; Count < RunRefCacheAware->Number; ++Count) { - Offset = RunRefCacheAware->RunRefSize * Count; - RunRef = (PEX_RUNDOWN_REF)((ULONG_PTR)RunRefCacheAware->RunRefs + Offset); + RunRef = ExGetRunRefForGivenProcessor(RunRefCacheAware, Count); _ExInitializeRundownProtection(RunRef); } } @@ -641,7 +637,7 @@ ExInitializeRundownProtectionCacheAware(IN PEX_RUNDOWN_REF_CACHE_AWARE RunRefCac { PVOID Pool; PEX_RUNDOWN_REF RunRef; - ULONG Count, RunRefSize, Offset, Align; + ULONG Count, RunRefSize, Align; PAGED_CODE(); @@ -683,8 +679,7 @@ ExInitializeRundownProtectionCacheAware(IN PEX_RUNDOWN_REF_CACHE_AWARE RunRefCac { for (Count = 0; Count < RunRefCacheAware->Number; ++Count) { - Offset = RunRefCacheAware->RunRefSize * Count; - RunRef = (PEX_RUNDOWN_REF)((ULONG_PTR)RunRefCacheAware->RunRefs + Offset); + RunRef = ExGetRunRefForGivenProcessor(RunRefCacheAware, Count); _ExInitializeRundownProtection(RunRef); } } diff --git a/ntoskrnl/include/internal/ex.h b/ntoskrnl/include/internal/ex.h index e09eb9ba05c..89fec759145 100644 --- a/ntoskrnl/include/internal/ex.h +++ b/ntoskrnl/include/internal/ex.h @@ -545,15 +545,6 @@ ExGetCountFastReference(IN EX_FAST_REF FastRef) return (ULONG)FastRef.RefCnt; } -FORCEINLINE -PEX_RUNDOWN_REF -ExGetRunRefForCurrentProcessor(IN PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware) -{ - return (PEX_RUNDOWN_REF)((ULONG_PTR)RunRefCacheAware->RunRefs + - RunRefCacheAware->RunRefSize * - (KeGetCurrentProcessorNumber() % RunRefCacheAware->Number)); -} - FORCEINLINE VOID ExInitializeFastReference(OUT PEX_FAST_REF FastRef, @@ -751,6 +742,16 @@ ExCompareSwapFastReference(IN PEX_FAST_REF FastRef, /* RUNDOWN *******************************************************************/ +FORCEINLINE +PEX_RUNDOWN_REF +ExGetRunRefForGivenProcessor(IN PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware, + IN ULONG ProcNumber) +{ + return (PEX_RUNDOWN_REF)((ULONG_PTR)RunRefCacheAware->RunRefs + + RunRefCacheAware->RunRefSize * + (ProcNumber % RunRefCacheAware->Number)); +} + /*++ * @name ExfAcquireRundownProtection * INTERNAL MACRO