From ecb6afadcc90e32e512ae8b535304ac2f99f4448 Mon Sep 17 00:00:00 2001 From: Royce Mitchell III Date: Sat, 13 Aug 2005 13:16:16 +0000 Subject: [PATCH] BCB tracing implementation svn path=/trunk/; revision=17367 --- reactos/ntoskrnl/cc/view.c | 121 ++++++++++++++++++++++++++++++---- reactos/ntoskrnl/ntoskrnl.def | 1 + 2 files changed, 108 insertions(+), 14 deletions(-) diff --git a/reactos/ntoskrnl/cc/view.c b/reactos/ntoskrnl/cc/view.c index 86143750590..7442ce37e51 100644 --- a/reactos/ntoskrnl/cc/view.c +++ b/reactos/ntoskrnl/cc/view.c @@ -81,12 +81,81 @@ void* _alloca(size_t size); #error Unknown compiler for alloca intrinsic stack allocation "function" #endif +#if defined(DBG) || defined(KDBG) +static void CcRosCacheSegmentIncRefCount ( PCACHE_SEGMENT cs ) +{ + ++cs->ReferenceCount; + if ( cs->Bcb->Trace ) + { + DPRINT1("CacheSegment %p ++RefCount=%d, Dirty %d, PageOut %d\n", + cs, cs->ReferenceCount, cs->Dirty, cs->PageOut ); + } +} +static void CcRosCacheSegmentDecRefCount ( PCACHE_SEGMENT cs ) +{ + --cs->ReferenceCount; + if ( cs->Bcb->Trace ) + { + DPRINT1("CacheSegment %p --RefCount=%d, Dirty %d, PageOut %d\n", + cs, cs->ReferenceCount, cs->Dirty, cs->PageOut ); + } +} +#else +#define CcRosCacheSegmentIncRefCount(cs) (++((cs)->ReferenceCount)) +#define CcRosCacheSegmentDecRefCount(cs) (--((cs)->ReferenceCount)) +#endif NTSTATUS CcRosInternalFreeCacheSegment(PCACHE_SEGMENT CacheSeg); /* FUNCTIONS *****************************************************************/ +VOID +STDCALL +CcRosTraceCacheMap ( + PBCB Bcb, + BOOLEAN Trace ) +{ +#if defined(DBG) || defined(KDBG) + KIRQL oldirql; + PLIST_ENTRY current_entry; + PCACHE_SEGMENT current; + + if ( !Bcb ) + return; + + Bcb->Trace = Trace; + + if ( Trace ) + { + DPRINT1("Enabling Tracing for CacheMap 0x%p:\n", Bcb ); + + ExAcquireFastMutex(&ViewLock); + KeAcquireSpinLock(&Bcb->BcbLock, &oldirql); + + current_entry = Bcb->BcbSegmentListHead.Flink; + while (current_entry != &Bcb->BcbSegmentListHead) + { + current = CONTAINING_RECORD(current_entry, CACHE_SEGMENT, BcbSegmentListEntry); + current_entry = current_entry->Flink; + + DPRINT1(" CacheSegment 0x%p enabled, RefCount %d, Dirty %d, PageOut %d\n", + current, current->ReferenceCount, current->Dirty, current->PageOut ); + } + KeReleaseSpinLock(&Bcb->BcbLock, oldirql); + ExReleaseFastMutex(&ViewLock); + } + else + { + DPRINT1("Disabling Tracing for CacheMap 0x%p:\n", Bcb ); + } + +#else + Bcb = Bcb; + Trace = Trace; +#endif +} + NTSTATUS CcRosFlushCacheSegment(PCACHE_SEGMENT CacheSegment) { @@ -100,7 +169,7 @@ CcRosFlushCacheSegment(PCACHE_SEGMENT CacheSegment) CacheSegment->Dirty = FALSE; RemoveEntryList(&CacheSegment->DirtySegmentListEntry); DirtyPageCount -= CacheSegment->Bcb->CacheSegmentSize / PAGE_SIZE; - CacheSegment->ReferenceCount--; + CcRosCacheSegmentDecRefCount ( CacheSegment ); KeReleaseSpinLock(&CacheSegment->Bcb->BcbLock, oldIrql); ExReleaseFastMutex(&ViewLock); } @@ -243,7 +312,7 @@ CcRosTrimCache(ULONG Target, ULONG Priority, PULONG NrFreed) ULONG i; NTSTATUS Status; - current->ReferenceCount++; + CcRosCacheSegmentIncRefCount(current); last = current; current->PageOut = TRUE; KeReleaseSpinLock(¤t->Bcb->BcbLock, oldIrql); @@ -260,8 +329,8 @@ CcRosTrimCache(ULONG Target, ULONG Priority, PULONG NrFreed) } ExAcquireFastMutex(&ViewLock); KeAcquireSpinLock(¤t->Bcb->BcbLock, &oldIrql); - current->ReferenceCount--; - current->PageOut = FALSE; + CcRosCacheSegmentDecRefCount(current); + current->PageOut = FALSE; KeReleaseSpinLock(¤t->Bcb->BcbLock, oldIrql); current_entry = ¤t->CacheSegmentLRUListEntry; continue; @@ -315,14 +384,14 @@ CcRosReleaseCacheSegment(PBCB Bcb, CacheSeg->MappedCount++; } KeAcquireSpinLock(&Bcb->BcbLock, &oldIrql); - CacheSeg->ReferenceCount--; + CcRosCacheSegmentDecRefCount(CacheSeg); if (Mapped && CacheSeg->MappedCount == 1) { - CacheSeg->ReferenceCount++; + CcRosCacheSegmentIncRefCount(CacheSeg); } if (!WasDirty && CacheSeg->Dirty) { - CacheSeg->ReferenceCount++; + CcRosCacheSegmentIncRefCount(CacheSeg); } KeReleaseSpinLock(&Bcb->BcbLock, oldIrql); ExReleaseFastMutex(&ViewLock); @@ -351,7 +420,7 @@ CcRosLookupCacheSegment(PBCB Bcb, ULONG FileOffset) if (current->FileOffset <= FileOffset && (current->FileOffset + Bcb->CacheSegmentSize) > FileOffset) { - current->ReferenceCount++; + CcRosCacheSegmentIncRefCount(current); KeReleaseSpinLock(&Bcb->BcbLock, oldIrql); ExAcquireFastMutex(¤t->Lock); return(current); @@ -387,7 +456,7 @@ CcRosMarkDirtyCacheSegment(PBCB Bcb, ULONG FileOffset) else { KeAcquireSpinLock(&Bcb->BcbLock, &oldIrql); - CacheSeg->ReferenceCount--; + CcRosCacheSegmentDecRefCount(CacheSeg); KeReleaseSpinLock(&Bcb->BcbLock, oldIrql); } @@ -430,14 +499,14 @@ CcRosUnmapCacheSegment(PBCB Bcb, ULONG FileOffset, BOOLEAN NowDirty) } KeAcquireSpinLock(&Bcb->BcbLock, &oldIrql); - CacheSeg->ReferenceCount--; + CcRosCacheSegmentDecRefCount(CacheSeg); if (!WasDirty && NowDirty) { - CacheSeg->ReferenceCount++; + CcRosCacheSegmentIncRefCount(CacheSeg); } if (CacheSeg->MappedCount == 0) { - CacheSeg->ReferenceCount--; + CcRosCacheSegmentDecRefCount(CacheSeg); } KeReleaseSpinLock(&Bcb->BcbLock, oldIrql); @@ -480,6 +549,12 @@ CcRosCreateCacheSegment(PBCB Bcb, current->PageOut = FALSE; current->FileOffset = ROUND_DOWN(FileOffset, Bcb->CacheSegmentSize); current->Bcb = Bcb; +#if defined(DBG) || defined(KDBG) + if ( Bcb->Trace ) + { + DPRINT1("CacheMap 0x%p: new Cache Segment: 0x%p\n", Bcb, current ); + } +#endif current->MappedCount = 0; current->DirtySegmentListEntry.Flink = NULL; current->DirtySegmentListEntry.Blink = NULL; @@ -504,8 +579,17 @@ CcRosCreateCacheSegment(PBCB Bcb, if (current->FileOffset <= FileOffset && (current->FileOffset + Bcb->CacheSegmentSize) > FileOffset) { - current->ReferenceCount++; + CcRosCacheSegmentIncRefCount(current); KeReleaseSpinLock(&Bcb->BcbLock, oldIrql); +#if defined(DBG) || defined(KDBG) + if ( Bcb->Trace ) + { + DPRINT1("CacheMap 0x%p: deleting newly created Cache Segment 0x%p ( found existing one 0x%p )\n", + Bcb, + (*CacheSeg), + current ); + } +#endif ExReleaseFastMutex(&(*CacheSeg)->Lock); ExReleaseFastMutex(&ViewLock); ExFreeToNPagedLookasideList(&CacheSegLookasideList, *CacheSeg); @@ -761,6 +845,12 @@ CcRosInternalFreeCacheSegment(PCACHE_SEGMENT CacheSeg) KIRQL oldIrql; #endif DPRINT("Freeing cache segment 0x%p\n", CacheSeg); +#if defined(DBG) || defined(KDBG) + if ( CacheSeg->Bcb->Trace ) + { + DPRINT1("CacheMap 0x%p: deleting Cache Segment: 0x%p\n", CacheSeg->Bcb, CacheSeg ); + } +#endif #ifdef CACHE_BITMAP RegionSize = CacheSeg->Bcb->CacheSegmentSize / PAGE_SIZE; @@ -878,7 +968,7 @@ CcFlushCache(IN PSECTION_OBJECT_POINTERS SectionObjectPointers, } KeAcquireSpinLock(&Bcb->BcbLock, &oldIrql); ExReleaseFastMutex(¤t->Lock); - current->ReferenceCount--; + CcRosCacheSegmentDecRefCount(current); KeReleaseSpinLock(&Bcb->BcbLock, oldIrql); } @@ -953,6 +1043,9 @@ CcRosDeleteFileCache(PFILE_OBJECT FileObject, PBCB Bcb) } InsertHeadList(&FreeList, ¤t->BcbSegmentListEntry); } +#if defined(DBG) || defined(KDBG) + Bcb->Trace = FALSE; +#endif KeReleaseSpinLock(&Bcb->BcbLock, oldIrql); ExReleaseFastMutex(&ViewLock); diff --git a/reactos/ntoskrnl/ntoskrnl.def b/reactos/ntoskrnl/ntoskrnl.def index 39e53dde5c1..abe4606ed98 100644 --- a/reactos/ntoskrnl/ntoskrnl.def +++ b/reactos/ntoskrnl/ntoskrnl.def @@ -7,6 +7,7 @@ EXPORTS CcRosInitializeFileCache@8 CcRosReleaseFileCache@4 +CcRosTraceCacheMap@8 CcCanIWrite@16 CcCopyRead@24 CcCopyWrite@20