2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: ntoskrnl/cc/cacheman.c
5 * PURPOSE: Cache manager
7 * PROGRAMMERS: David Welch (welch@cwcom.net)
8 * Pierre Schweitzer (pierre@reactos.org)
11 /* INCLUDES *****************************************************************/
17 BOOLEAN CcPfEnablePrefetcher
;
18 PFSN_PREFETCHER_GLOBALS CcPfGlobals
;
19 MM_SYSTEMSIZE CcCapturedSystemSize
;
21 static ULONG BugCheckFileId
= 0x4 << 16;
23 /* FUNCTIONS *****************************************************************/
28 CcPfInitializePrefetcher(VOID
)
31 DbgPrintEx(DPFLTR_PREFETCHER_ID
,
33 "CCPF: InitializePrefetecher()\n");
35 /* Setup the Prefetcher Data */
36 InitializeListHead(&CcPfGlobals
.ActiveTraces
);
37 InitializeListHead(&CcPfGlobals
.CompletedTraces
);
38 ExInitializeFastMutex(&CcPfGlobals
.CompletedTracesLock
);
40 /* FIXME: Setup the rest of the prefetecher */
46 CcInitializeCacheManager(VOID
)
52 /* Initialize lazy-writer lists */
53 InitializeListHead(&CcIdleWorkerThreadList
);
54 InitializeListHead(&CcRegularWorkQueue
);
55 InitializeListHead(&CcPostTickWorkQueue
);
57 /* Define lazy writer threshold and the amount of workers,
58 * depending on the system type
60 CcCapturedSystemSize
= MmQuerySystemSize();
61 switch (CcCapturedSystemSize
)
64 CcNumberWorkerThreads
= ExCriticalWorkerThreads
- 1;
65 CcDirtyPageThreshold
= MmNumberOfPhysicalPages
/ 8;
69 CcNumberWorkerThreads
= ExCriticalWorkerThreads
- 1;
70 CcDirtyPageThreshold
= MmNumberOfPhysicalPages
/ 4;
74 CcNumberWorkerThreads
= ExCriticalWorkerThreads
- 2;
75 CcDirtyPageThreshold
= MmNumberOfPhysicalPages
/ 8 + MmNumberOfPhysicalPages
/ 4;
79 CcNumberWorkerThreads
= 1;
80 CcDirtyPageThreshold
= MmNumberOfPhysicalPages
/ 8;
84 /* Allocate a work item for all our threads */
85 for (Thread
= 0; Thread
< CcNumberWorkerThreads
; ++Thread
)
87 PWORK_QUEUE_ITEM Item
;
89 Item
= ExAllocatePoolWithTag(NonPagedPool
, sizeof(WORK_QUEUE_ITEM
), 'qWcC');
95 /* By default, it's obviously idle */
96 ExInitializeWorkItem(Item
, CcWorkerThread
, Item
);
97 InsertTailList(&CcIdleWorkerThreadList
, &Item
->List
);
100 /* Initialize our lazy writer */
101 RtlZeroMemory(&LazyWriter
, sizeof(LazyWriter
));
102 InitializeListHead(&LazyWriter
.WorkQueue
);
103 /* Delay activation of the lazy writer */
104 KeInitializeDpc(&LazyWriter
.ScanDpc
, CcScanDpc
, NULL
);
105 KeInitializeTimer(&LazyWriter
.ScanTimer
);
107 /* Lookaside list for our work items */
108 ExInitializeNPagedLookasideList(&CcTwilightLookasideList
, NULL
, NULL
, 0, sizeof(WORK_QUEUE_ENTRY
), 'KWcC', 0);
115 CcShutdownSystem(VOID
)
125 CcGetFlushedValidData (
126 IN PSECTION_OBJECT_POINTERS SectionObjectPointer
,
127 IN BOOLEAN BcbListHeld
157 CcScheduleReadAhead (
158 IN PFILE_OBJECT FileObject
,
159 IN PLARGE_INTEGER FileOffset
,
171 CcSetAdditionalCacheAttributes (
172 IN PFILE_OBJECT FileObject
,
173 IN BOOLEAN DisableReadAhead
,
174 IN BOOLEAN DisableWriteBehind
178 PROS_SHARED_CACHE_MAP SharedCacheMap
;
180 CCTRACE(CC_API_DEBUG
, "FileObject=%p DisableReadAhead=%d DisableWriteBehind=%d\n",
181 FileObject
, DisableReadAhead
, DisableWriteBehind
);
183 SharedCacheMap
= FileObject
->SectionObjectPointer
->SharedCacheMap
;
185 OldIrql
= KeAcquireQueuedSpinLock(LockQueueMasterLock
);
187 if (DisableReadAhead
)
189 SetFlag(SharedCacheMap
->Flags
, READAHEAD_DISABLED
);
193 ClearFlag(SharedCacheMap
->Flags
, READAHEAD_DISABLED
);
196 if (DisableWriteBehind
)
198 /* FIXME: also set flag 0x200 */
199 SetFlag(SharedCacheMap
->Flags
, WRITEBEHIND_DISABLED
);
203 ClearFlag(SharedCacheMap
->Flags
, WRITEBEHIND_DISABLED
);
205 KeReleaseQueuedSpinLock(LockQueueMasterLock
, OldIrql
);
213 CcSetBcbOwnerPointer (
218 PINTERNAL_BCB iBcb
= Bcb
;
220 CCTRACE(CC_API_DEBUG
, "Bcb=%p Owner=%p\n",
223 if (!ExIsResourceAcquiredExclusiveLite(&iBcb
->Lock
) && !ExIsResourceAcquiredSharedLite(&iBcb
->Lock
))
225 DPRINT1("Current thread doesn't own resource!\n");
229 ExSetResourceOwnerPointer(&iBcb
->Lock
, Owner
);
237 CcSetDirtyPageThreshold (
238 IN PFILE_OBJECT FileObject
,
239 IN ULONG DirtyPageThreshold
242 PFSRTL_COMMON_FCB_HEADER Fcb
;
243 PROS_SHARED_CACHE_MAP SharedCacheMap
;
245 CCTRACE(CC_API_DEBUG
, "FileObject=%p DirtyPageThreshold=%lu\n",
246 FileObject
, DirtyPageThreshold
);
248 SharedCacheMap
= FileObject
->SectionObjectPointer
->SharedCacheMap
;
249 if (SharedCacheMap
!= NULL
)
251 SharedCacheMap
->DirtyPageThreshold
= DirtyPageThreshold
;
254 Fcb
= FileObject
->FsContext
;
255 if (!BooleanFlagOn(Fcb
->Flags
, FSRTL_FLAG_LIMIT_MODIFIED_PAGES
))
257 SetFlag(Fcb
->Flags
, FSRTL_FLAG_LIMIT_MODIFIED_PAGES
);
266 CcSetReadAheadGranularity (
267 IN PFILE_OBJECT FileObject
,
271 PPRIVATE_CACHE_MAP PrivateMap
;
273 CCTRACE(CC_API_DEBUG
, "FileObject=%p Granularity=%lu\n",
274 FileObject
, Granularity
);
276 PrivateMap
= FileObject
->PrivateCacheMap
;
277 PrivateMap
->ReadAheadMask
= Granularity
- 1;