BCB tracing implementation

svn path=/trunk/; revision=17367
This commit is contained in:
Royce Mitchell III 2005-08-13 13:16:16 +00:00
parent a2525f8275
commit ecb6afadcc
2 changed files with 108 additions and 14 deletions

View file

@ -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(&current->Bcb->BcbLock, oldIrql);
@ -260,8 +329,8 @@ CcRosTrimCache(ULONG Target, ULONG Priority, PULONG NrFreed)
}
ExAcquireFastMutex(&ViewLock);
KeAcquireSpinLock(&current->Bcb->BcbLock, &oldIrql);
current->ReferenceCount--;
current->PageOut = FALSE;
CcRosCacheSegmentDecRefCount(current);
current->PageOut = FALSE;
KeReleaseSpinLock(&current->Bcb->BcbLock, oldIrql);
current_entry = &current->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(&current->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(&current->Lock);
current->ReferenceCount--;
CcRosCacheSegmentDecRefCount(current);
KeReleaseSpinLock(&Bcb->BcbLock, oldIrql);
}
@ -953,6 +1043,9 @@ CcRosDeleteFileCache(PFILE_OBJECT FileObject, PBCB Bcb)
}
InsertHeadList(&FreeList, &current->BcbSegmentListEntry);
}
#if defined(DBG) || defined(KDBG)
Bcb->Trace = FALSE;
#endif
KeReleaseSpinLock(&Bcb->BcbLock, oldIrql);
ExReleaseFastMutex(&ViewLock);

View file

@ -7,6 +7,7 @@
EXPORTS
CcRosInitializeFileCache@8
CcRosReleaseFileCache@4
CcRosTraceCacheMap@8
CcCanIWrite@16
CcCopyRead@24
CcCopyWrite@20