https://git.reactos.org/?p=reactos.git;a=commitdiff;h=0187c1e11394095ca644d5...
commit 0187c1e11394095ca644d5cf622737cb3bca6f14 Author: Jérôme Gardou jerome.gardou@reactos.org AuthorDate: Tue Mar 30 16:20:25 2021 +0200 Commit: Jérôme Gardou jerome.gardou@reactos.org CommitDate: Tue Mar 30 16:26:43 2021 +0200
[NTOS:MM] Fix PFN tracing --- ntoskrnl/cc/view.c | 19 ------------------- ntoskrnl/include/internal/mm.h | 42 +++++++++++++++++++++++++++++++++++++++++- ntoskrnl/mm/ARM3/mminit.c | 4 ++-- ntoskrnl/mm/ARM3/pagfault.c | 9 +++++++++ ntoskrnl/mm/ARM3/pfnlist.c | 13 ++++++------- ntoskrnl/mm/ARM3/sysldr.c | 9 +-------- ntoskrnl/mm/freelist.c | 15 +++++++++++++++ ntoskrnl/mm/section.c | 6 ------ 8 files changed, 74 insertions(+), 43 deletions(-)
diff --git a/ntoskrnl/cc/view.c b/ntoskrnl/cc/view.c index 6481c340fe0..cb99d809a5d 100644 --- a/ntoskrnl/cc/view.c +++ b/ntoskrnl/cc/view.c @@ -806,25 +806,6 @@ Retry: InsertTailList(&VacbLruListHead, ¤t->VacbLruListEntry); KeReleaseQueuedSpinLock(LockQueueMasterLock, oldIrql);
- MI_SET_USAGE(MI_USAGE_CACHE); -#if MI_TRACE_PFNS - if ((SharedCacheMap->FileObject) && (SharedCacheMap->FileObject->FileName.Buffer)) - { - PWCHAR pos; - ULONG len = 0; - pos = wcsrchr(SharedCacheMap->FileObject->FileName.Buffer, '\'); - if (pos) - { - len = wcslen(pos) * sizeof(WCHAR); - snprintf(MI_PFN_CURRENT_PROCESS_NAME, min(16, len), "%S", pos); - } - else - { - snprintf(MI_PFN_CURRENT_PROCESS_NAME, min(16, len), "%wZ", &SharedCacheMap->FileObject->FileName); - } - } -#endif - /* Reference it to allow release */ CcRosVacbIncRefCount(current);
diff --git a/ntoskrnl/include/internal/mm.h b/ntoskrnl/include/internal/mm.h index a661aa469f3..074dbd4e454 100644 --- a/ntoskrnl/include/internal/mm.h +++ b/ntoskrnl/include/internal/mm.h @@ -245,9 +245,45 @@ MM_RMAP_ENTRY, *PMM_RMAP_ENTRY; extern ULONG MI_PFN_CURRENT_USAGE; extern CHAR MI_PFN_CURRENT_PROCESS_NAME[16]; #define MI_SET_USAGE(x) MI_PFN_CURRENT_USAGE = x -#define MI_SET_PROCESS2(x) memcpy(MI_PFN_CURRENT_PROCESS_NAME, x, 16) +#define MI_SET_PROCESS2(x) memcpy(MI_PFN_CURRENT_PROCESS_NAME, x, min(sizeof(x), sizeof(MI_PFN_CURRENT_PROCESS_NAME))) +FORCEINLINE +void +MI_SET_PROCESS(PEPROCESS Process) +{ + if (!Process) + MI_SET_PROCESS2("Kernel"); + else if (Process == (PEPROCESS)1) + MI_SET_PROCESS2("Hydra"); + else + MI_SET_PROCESS2(Process->ImageFileName); +} + +FORCEINLINE +void +MI_SET_PROCESS_USTR(PUNICODE_STRING ustr) +{ + PWSTR pos, strEnd; + int i; + + if (!ustr->Buffer || ustr->Length == 0) + { + MI_PFN_CURRENT_PROCESS_NAME[0] = 0; + return; + } + + pos = strEnd = &ustr->Buffer[ustr->Length / sizeof(WCHAR)]; + while ((*pos != L'\') && (pos > ustr->Buffer)) + pos--; + + if (*pos == L'\') + pos++; + + for (i = 0; i < sizeof(MI_PFN_CURRENT_PROCESS_NAME) && pos <= strEnd; i++, pos++) + MI_PFN_CURRENT_PROCESS_NAME[i] = (CHAR)*pos; +} #else #define MI_SET_USAGE(x) +#define MI_SET_PROCESS(x) #define MI_SET_PROCESS2(x) #endif
@@ -275,6 +311,9 @@ typedef enum _MI_PFN_USAGES MI_USAGE_PFN_DATABASE, MI_USAGE_BOOT_DRIVER, MI_USAGE_INIT_MEMORY, + MI_USAGE_PAGE_FILE, + MI_USAGE_COW, + MI_USAGE_WSLE, MI_USAGE_FREE_PAGE } MI_PFN_USAGES;
@@ -355,6 +394,7 @@ typedef struct _MMPFN #if MI_TRACE_PFNS MI_PFN_USAGES PfnUsage; CHAR ProcessName[16]; +#define MI_SET_PFN_PROCESS_NAME(pfn, x) memcpy(pfn->ProcessName, x, min(sizeof(x), sizeof(pfn->ProcessName))) #endif
// HACK until WS lists are supported diff --git a/ntoskrnl/mm/ARM3/mminit.c b/ntoskrnl/mm/ARM3/mminit.c index 64e2193a558..9b18537f3ac 100644 --- a/ntoskrnl/mm/ARM3/mminit.c +++ b/ntoskrnl/mm/ARM3/mminit.c @@ -801,7 +801,7 @@ MiBuildPfnDatabaseFromPages(IN PLOADER_PARAMETER_BLOCK LoaderBlock) Pfn1->u3.e1.CacheAttribute = MiNonCached; #if MI_TRACE_PFNS Pfn1->PfnUsage = MI_USAGE_INIT_MEMORY; - memcpy(Pfn1->ProcessName, "Initial PDE", 16); + MI_SET_PFN_PROCESS_NAME(Pfn1, "Initial PDE"); #endif } else @@ -848,7 +848,7 @@ MiBuildPfnDatabaseFromPages(IN PLOADER_PARAMETER_BLOCK LoaderBlock) Pfn2->u3.e1.CacheAttribute = MiNonCached; #if MI_TRACE_PFNS Pfn2->PfnUsage = MI_USAGE_INIT_MEMORY; - memcpy(Pfn1->ProcessName, "Initial PTE", 16); + MI_SET_PFN_PROCESS_NAME(Pfn2, "Initial PTE"); #endif } } diff --git a/ntoskrnl/mm/ARM3/pagfault.c b/ntoskrnl/mm/ARM3/pagfault.c index 6d60645debd..87c789c1742 100644 --- a/ntoskrnl/mm/ARM3/pagfault.c +++ b/ntoskrnl/mm/ARM3/pagfault.c @@ -899,6 +899,9 @@ MiResolvePageFileFault(_In_ BOOLEAN StoreInstruction, ASSERT(CurrentProcess > HYDRA_PROCESS); ASSERT(*OldIrql != MM_NOIRQL);
+ MI_SET_USAGE(MI_USAGE_PAGE_FILE); + MI_SET_PROCESS(CurrentProcess); + /* We must hold the PFN lock */ MI_ASSERT_PFN_LOCK_HELD();
@@ -1210,6 +1213,9 @@ MiResolveProtoPteFault(IN BOOLEAN StoreInstruction, ASSERT(TempPte.u.Hard.Valid == 1); ProtoPageFrameIndex = PFN_FROM_PTE(&TempPte);
+ MI_SET_USAGE(MI_USAGE_COW); + MI_SET_PROCESS(Process); + /* Get a new page for the private copy */ if (Process > HYDRA_PROCESS) Color = MI_GET_NEXT_PROCESS_COLOR(Process); @@ -2210,6 +2216,9 @@ UserFault:
ASSERT(MmAvailablePages > 0);
+ MI_SET_USAGE(MI_USAGE_COW); + MI_SET_PROCESS(CurrentProcess); + /* Allocate a new page and copy it */ PageFrameIndex = MiRemoveAnyPage(MI_GET_NEXT_PROCESS_COLOR(CurrentProcess)); OldPageFrameIndex = PFN_FROM_PTE(&TempPte); diff --git a/ntoskrnl/mm/ARM3/pfnlist.c b/ntoskrnl/mm/ARM3/pfnlist.c index f175541a500..a75f2194396 100644 --- a/ntoskrnl/mm/ARM3/pfnlist.c +++ b/ntoskrnl/mm/ARM3/pfnlist.c @@ -254,8 +254,8 @@ MiUnlinkFreeOrZeroedPage(IN PMMPFN Entry) ASSERT(MI_PFN_CURRENT_USAGE != MI_USAGE_NOT_SET); Entry->PfnUsage = MI_PFN_CURRENT_USAGE; memcpy(Entry->ProcessName, MI_PFN_CURRENT_PROCESS_NAME, 16); -// MI_PFN_CURRENT_USAGE = MI_USAGE_NOT_SET; -// memcpy(MI_PFN_CURRENT_PROCESS_NAME, "Not Set", 16); + MI_PFN_CURRENT_USAGE = MI_USAGE_NOT_SET; + MI_SET_PROCESS2("Not Set"); #endif }
@@ -459,11 +459,11 @@ MiRemovePageByColor(IN PFN_NUMBER PageIndex, MiDecrementAvailablePages();
#if MI_TRACE_PFNS - //ASSERT(MI_PFN_CURRENT_USAGE != MI_USAGE_NOT_SET); + ASSERT(MI_PFN_CURRENT_USAGE != MI_USAGE_NOT_SET); Pfn1->PfnUsage = MI_PFN_CURRENT_USAGE; memcpy(Pfn1->ProcessName, MI_PFN_CURRENT_PROCESS_NAME, 16); - //MI_PFN_CURRENT_USAGE = MI_USAGE_NOT_SET; - //memcpy(MI_PFN_CURRENT_PROCESS_NAME, "Not Set", 16); + MI_PFN_CURRENT_USAGE = MI_USAGE_NOT_SET; + MI_SET_PROCESS2("Not Set"); #endif
/* Return the page */ @@ -937,9 +937,8 @@ MiInsertPageInList(IN PMMPFNLIST ListHead, ColorHead->Count++;
#if MI_TRACE_PFNS - //ASSERT(MI_PFN_CURRENT_USAGE == MI_USAGE_NOT_SET); + ASSERT(MI_PFN_CURRENT_USAGE == MI_USAGE_NOT_SET); Pfn1->PfnUsage = MI_USAGE_FREE_PAGE; - MI_PFN_CURRENT_USAGE = MI_USAGE_NOT_SET; RtlZeroMemory(Pfn1->ProcessName, 16); #endif } diff --git a/ntoskrnl/mm/ARM3/sysldr.c b/ntoskrnl/mm/ARM3/sysldr.c index 0ebcae75e29..745543403f4 100644 --- a/ntoskrnl/mm/ARM3/sysldr.c +++ b/ntoskrnl/mm/ARM3/sysldr.c @@ -188,14 +188,7 @@ MiLoadImageSection(_Inout_ PSECTION *SectionPtr, /* Some debug stuff */ MI_SET_USAGE(MI_USAGE_DRIVER_PAGE); #if MI_TRACE_PFNS - if (FileName->Buffer) - { - PWCHAR pos = NULL; - ULONG len = 0; - pos = wcsrchr(FileName->Buffer, '\'); - len = wcslen(pos) * sizeof(WCHAR); - if (pos) snprintf(MI_PFN_CURRENT_PROCESS_NAME, min(16, len), "%S", pos); - } + MI_SET_PROCESS_USTR(FileName); #endif
/* Grab a page */ diff --git a/ntoskrnl/mm/freelist.c b/ntoskrnl/mm/freelist.c index 4aa15a12582..b00cf1fbc04 100644 --- a/ntoskrnl/mm/freelist.c +++ b/ntoskrnl/mm/freelist.c @@ -610,6 +610,21 @@ MmAllocPage(ULONG Type)
OldIrql = MiAcquirePfnLock();
+#if MI_TRACE_PFNS + switch(Type) + { + case MC_CACHE: + case MC_SYSTEM: + MI_SET_USAGE(MI_USAGE_CACHE); + break; + case MC_USER: + MI_SET_USAGE(MI_USAGE_SECTION); + break; + default: + ASSERT(FALSE); + } +#endif + PfnOffset = MiRemoveZeroPage(MI_GET_NEXT_COLOR()); if (!PfnOffset) { diff --git a/ntoskrnl/mm/section.c b/ntoskrnl/mm/section.c index b3e300a58cc..3ff8098937d 100644 --- a/ntoskrnl/mm/section.c +++ b/ntoskrnl/mm/section.c @@ -1803,9 +1803,6 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace, MmUnlockSectionSegment(Segment);
MmUnlockAddressSpace(AddressSpace); - MI_SET_USAGE(MI_USAGE_SECTION); - if (Process) MI_SET_PROCESS2(Process->ImageFileName); - if (!Process) MI_SET_PROCESS2("Kernel Section"); Status = MmRequestPageMemoryConsumer(MC_USER, TRUE, &Page); if (!NT_SUCCESS(Status)) { @@ -1975,9 +1972,6 @@ MmAccessFaultSectionView(PMMSUPPORT AddressSpace, /* * Allocate a page */ - MI_SET_USAGE(MI_USAGE_SECTION); - if (Process) MI_SET_PROCESS2(Process->ImageFileName); - if (!Process) MI_SET_PROCESS2("Kernel Section"); Status = MmRequestPageMemoryConsumer(MC_USER, TRUE, &NewPage); if (!NT_SUCCESS(Status)) {