--- a/ntoskrnl/mm/ARM3/zeropage.c +++ b/ntoskrnl/mm/ARM3/zeropage.c @@ -43,6 +43,8 @@ MmZeroPageThread(VOID) PVOID ZeroAddress; PFN_NUMBER PageIndex, FreePage; PMMPFN Pfn1; + LARGE_INTEGER StartCounter, EndCounter, Frequency; + ULONG PageCount; /* Get the discardable sections to free them */ MiFindInitializationCode(&StartAddress, &EndAddress); @@ -67,9 +69,12 @@ MmZeroPageThread(VOID) FALSE, NULL, NULL); + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); MmZeroingPageThreadActive = TRUE; + PageCount = 0; + StartCounter = KeQueryPerformanceCounter(NULL); while (TRUE) { if (!MmFreePageListHead.Total) @@ -103,11 +108,20 @@ MmZeroPageThread(VOID) ASSERT(ZeroAddress); RtlZeroMemory(ZeroAddress, PAGE_SIZE); MiUnmapPagesInZeroSpace(ZeroAddress, 1); + PageCount++; OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); MiInsertPageInList(&MmZeroedPageListHead, PageIndex); } + if (PageCount > 16) + { + EndCounter = KeQueryPerformanceCounter(&Frequency); + EndCounter.QuadPart -= StartCounter.QuadPart; + EndCounter.QuadPart *= 1000000000; + EndCounter.QuadPart /= Frequency.QuadPart; + DPRINT1("Zeroed %lu pages (%lu MB) in %I64u ns @ %I64u ns/page (total)\n", PageCount, PageCount / (1024 * 1024 / PAGE_SIZE), EndCounter.QuadPart, EndCounter.QuadPart / PageCount); + } } }