Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

208 lines
4.5 KiB

/*++
Copyright (c) 1990 Microsoft Corporation
Module Name:
cachedat.c
Abstract:
This module implements the Memory Management based cache management
routines for the common Cache subsystem.
Author:
Tom Miller [TomM] 4-May-1990
Revision History:
--*/
#include "cc.h"
//
// Global SharedCacheMap lists and resource to synchronize access to it.
//
//
// extern KSPIN_LOCK CcMasterSpinLock;
LIST_ENTRY CcCleanSharedCacheMapList;
SHARED_CACHE_MAP_LIST_CURSOR CcDirtySharedCacheMapList;
SHARED_CACHE_MAP_LIST_CURSOR CcLazyWriterCursor;
//
// Worker thread structures:
//
// A spinlock to synchronize all three lists.
// A count of the number of worker threads Cc will use
// A count of the number of worker threads Cc in use
// A listhead for preinitialized executive work items for Cc use.
// A listhead for an express queue of WORK_QUEUE_ENTRYs
// A listhead for a regular queue of WORK_QUEUE_ENTRYs
// A listhead for a post-tick queue of WORK_QUEUE_ENTRYs
//
// A flag indicating if we are throttling the queue to a single thread
//
// extern KSPIN_LOCK CcWorkQueueSpinLock;
ULONG CcNumberWorkerThreads = 0;
ULONG CcNumberActiveWorkerThreads = 0;
LIST_ENTRY CcIdleWorkerThreadList;
LIST_ENTRY CcExpressWorkQueue;
LIST_ENTRY CcRegularWorkQueue;
LIST_ENTRY CcPostTickWorkQueue;
BOOLEAN CcQueueThrottle = FALSE;
//
// Store the current idle delay and target time to clean all. We must calculate
// the idle delay in terms of clock ticks for the lazy writer timeout.
//
ULONG CcIdleDelayTick;
LARGE_INTEGER CcNoDelay;
LARGE_INTEGER CcFirstDelay = {(ULONG)-(3*LAZY_WRITER_IDLE_DELAY), -1};
LARGE_INTEGER CcIdleDelay = {(ULONG)-LAZY_WRITER_IDLE_DELAY, -1};
LARGE_INTEGER CcCollisionDelay = {(ULONG)-LAZY_WRITER_COLLISION_DELAY, -1};
LARGE_INTEGER CcTargetCleanDelay = {(ULONG)-(LONG)(LAZY_WRITER_IDLE_DELAY * (LAZY_WRITER_MAX_AGE_TARGET + 1)), -1};
//
// Spinlock for controlling access to Vacb and related global structures,
// and a counter indicating how many Vcbs are active.
//
// extern KSPIN_LOCK CcVacbSpinLock;
ULONG_PTR CcNumberVacbs;
//
// Pointer to the global Vacb vector.
//
PVACB CcVacbs;
PVACB CcBeyondVacbs;
LIST_ENTRY CcVacbLru;
LIST_ENTRY CcVacbFreeList;
ULONG CcMaxVacbLevelsSeen = 1;
ULONG CcVacbLevelEntries = 0;
PVACB *CcVacbLevelFreeList = NULL;
ULONG CcVacbLevelWithBcbsEntries = 0;
PVACB *CcVacbLevelWithBcbsFreeList = NULL;
//
// Deferred write list and respective Thresholds
//
extern KSPIN_LOCK CcDeferredWriteSpinLock;
LIST_ENTRY CcDeferredWrites;
ULONG CcDirtyPageThreshold;
ULONG CcDirtyPageTarget;
ULONG CcPagesYetToWrite;
ULONG CcPagesWrittenLastTime = 0;
ULONG CcDirtyPagesLastScan = 0;
ULONG CcAvailablePagesThreshold = 100;
ULONG CcTotalDirtyPages = 0;
//
// Captured system size
//
MM_SYSTEMSIZE CcCapturedSystemSize;
//
// Number of outstanding aggresive zeroers in the system. Used
// to throttle the activity.
//
LONG CcAggressiveZeroCount;
LONG CcAggressiveZeroThreshold;
//
// Tuning options du Jour
//
ULONG CcTune = 0;
//
// Global structure controlling lazy writer algorithms
//
LAZY_WRITER LazyWriter;
GENERAL_LOOKASIDE CcTwilightLookasideList;
#ifdef CCDBG
LONG CcDebugTraceLevel = 0;
LONG CcDebugTraceIndent = 0;
#ifdef CCDBG_LOCK
extern KSPIN_LOCK CcDebugTraceLock;
#endif // def CCDBG_LOCK
#endif
//
// Global list of pinned Bcbs which may be examined for debug purposes
//
#if DBG
ULONG CcBcbCount;
LIST_ENTRY CcBcbList;
#endif
//
// Throw away miss counter.
//
ULONG CcThrowAway;
//
// Performance Counters
//
ULONG CcFastReadNoWait;
ULONG CcFastReadWait;
ULONG CcFastReadResourceMiss;
ULONG CcFastReadNotPossible;
ULONG CcFastMdlReadNoWait;
ULONG CcFastMdlReadWait;
ULONG CcFastMdlReadResourceMiss;
ULONG CcFastMdlReadNotPossible;
ULONG CcMapDataNoWait;
ULONG CcMapDataWait;
ULONG CcMapDataNoWaitMiss;
ULONG CcMapDataWaitMiss;
ULONG CcPinMappedDataCount;
ULONG CcPinReadNoWait;
ULONG CcPinReadWait;
ULONG CcPinReadNoWaitMiss;
ULONG CcPinReadWaitMiss;
ULONG CcCopyReadNoWait;
ULONG CcCopyReadWait;
ULONG CcCopyReadNoWaitMiss;
ULONG CcCopyReadWaitMiss;
ULONG CcMdlReadNoWait;
ULONG CcMdlReadWait;
ULONG CcMdlReadNoWaitMiss;
ULONG CcMdlReadWaitMiss;
ULONG CcReadAheadIos;
ULONG CcLazyWriteHotSpots;
ULONG CcLazyWriteIos;
ULONG CcLazyWritePages;
ULONG CcDataFlushes;
ULONG CcDataPages;
ULONG CcLostDelayedWrites;
PULONG CcMissCounter = &CcThrowAway;