https://git.reactos.org/?p=reactos.git;a=commitdiff;h=c7e09061caa02ee000ab3…
commit c7e09061caa02ee000ab33f1578bd3786e37fdd8
Author: Jérôme Gardou <jerome.gardou(a)reactos.org>
AuthorDate: Mon Jun 7 14:12:21 2021 +0200
Commit: Jérôme Gardou <zefklop(a)users.noreply.github.com>
CommitDate: Wed Jun 9 11:27:18 2021 +0200
[NTOS:MM] Get rid of MiQueryPageTableReferences
---
ntoskrnl/mm/ARM3/miarm.h | 29 -----------------------------
ntoskrnl/mm/ARM3/virtual.c | 34 ++++++++++++++--------------------
ntoskrnl/mm/i386/page.c | 2 +-
3 files changed, 15 insertions(+), 50 deletions(-)
diff --git a/ntoskrnl/mm/ARM3/miarm.h b/ntoskrnl/mm/ARM3/miarm.h
index 2145b4c319e..721c66c54bb 100644
--- a/ntoskrnl/mm/ARM3/miarm.h
+++ b/ntoskrnl/mm/ARM3/miarm.h
@@ -2477,17 +2477,6 @@ MiDecrementPageTableReferences(IN PVOID Address)
ASSERT(*RefCount < PTE_PER_PAGE);
return *RefCount;
}
-
-FORCEINLINE
-USHORT
-MiQueryPageTableReferences(IN PVOID Address)
-{
- PUSHORT RefCount;
-
- RefCount = &MmWorkingSetList->UsedPageTableEntries[MiGetPdeOffset(Address)];
-
- return *RefCount;
-}
#else
FORCEINLINE
USHORT
@@ -2543,24 +2532,6 @@ MiDecrementPageTableReferences(IN PVOID Address)
return Pfn->OriginalPte.u.Soft.UsedPageTableEntries;
}
-
-FORCEINLINE
-USHORT
-MiQueryPageTableReferences(IN PVOID Address)
-{
- PMMPDE PointerPde;
- PMMPFN Pfn;
-
- /* Make sure we're locked */
- ASSERT((PsGetCurrentThread()->OwnsProcessWorkingSetExclusive) ||
(PsGetCurrentThread()->OwnsProcessWorkingSetShared));
-
- PointerPde = MiAddressToPde(Address);
- ASSERT(PointerPde->u.Hard.Valid);
-
- /* This lies on the PFN */
- Pfn = MiGetPfnEntry(PFN_FROM_PDE(PointerPde));
- return Pfn->OriginalPte.u.Soft.UsedPageTableEntries;
-}
#endif
#ifdef __cplusplus
diff --git a/ntoskrnl/mm/ARM3/virtual.c b/ntoskrnl/mm/ARM3/virtual.c
index a94ba54afaa..27e2daa4241 100644
--- a/ntoskrnl/mm/ARM3/virtual.c
+++ b/ntoskrnl/mm/ARM3/virtual.c
@@ -659,12 +659,13 @@ MiDeleteVirtualAddresses(IN ULONG_PTR Va,
PointerPte = MiAddressToPte(Va);
do
{
+ /* Making sure the PDE is still valid */
+ ASSERT(PointerPde->u.Hard.Valid == 1);
+
/* Capture the PDE and make sure it exists */
TempPte = *PointerPte;
if (TempPte.u.Long)
{
- MiDecrementPageTableReferences((PVOID)Va);
-
/* Check if the PTE is actually mapped in */
if (MI_IS_MAPPED_PTE(&TempPte))
{
@@ -709,29 +710,23 @@ MiDeleteVirtualAddresses(IN ULONG_PTR Va,
/* The PTE was never mapped, just nuke it here */
MI_ERASE_PTE(PointerPte);
}
+
+ if (MiDecrementPageTableReferences((PVOID)Va) == 0)
+ {
+ ASSERT(PointerPde->u.Long != 0);
+ /* Delete the PDE proper */
+ MiDeletePde(PointerPde, CurrentProcess);
+ /* Jump */
+ Va = (ULONG_PTR)MiPdeToAddress(PointerPde + 1);
+ break;
+ }
}
/* Update the address and PTE for it */
Va += PAGE_SIZE;
PointerPte++;
PrototypePte++;
-
- /* Making sure the PDE is still valid */
- ASSERT(PointerPde->u.Hard.Valid == 1);
- }
- while ((Va & (PDE_MAPPED_VA - 1)) && (Va <= EndingAddress));
-
- /* The PDE should still be valid at this point */
- ASSERT(PointerPde->u.Hard.Valid == 1);
-
- /* Check remaining PTE count (go back 1 page due to above loop) */
- if (MiQueryPageTableReferences((PVOID)(Va - PAGE_SIZE)) == 0)
- {
- ASSERT(PointerPde->u.Long != 0);
-
- /* Delete the PDE proper */
- MiDeletePde(PointerPde, CurrentProcess);
- }
+ } while ((Va & (PDE_MAPPED_VA - 1)) && (Va <= EndingAddress));
/* Release the lock */
MiReleasePfnLock(OldIrql);
@@ -739,7 +734,6 @@ MiDeleteVirtualAddresses(IN ULONG_PTR Va,
if (Va > EndingAddress) return;
/* Otherwise, we exited because we hit a new PDE boundary, so start over */
- PointerPde = MiAddressToPde(Va);
AddressGap = FALSE;
}
}
diff --git a/ntoskrnl/mm/i386/page.c b/ntoskrnl/mm/i386/page.c
index 2c402c51478..7210d769df8 100644
--- a/ntoskrnl/mm/i386/page.c
+++ b/ntoskrnl/mm/i386/page.c
@@ -119,7 +119,7 @@ BOOLEAN
MiIsPageTablePresent(PVOID Address)
{
#if _MI_PAGING_LEVELS == 2
- return MiQueryPageTableReferences(Address) != 0;
+ return MmWorkingSetList->UsedPageTableEntries[MiGetPdeOffset(Address)] != 0;
#else
PMMPDE PointerPde;
PMMPPE PointerPpe;