[NTOSKRNL:CC] Implement CcAdjustWriteBehindThreadPool and CcAdjustWriteBehindThreadPoolIfNeeded
These two function are responsible for calling threadpool,when needed
This commit is contained in:
parent
1c173364a1
commit
e75a2adeec
@ -1175,44 +1175,7 @@ NTAPI CcLazyWriteScan()
|
|||||||
CcScheduleLazyWriteScan(FALSE);
|
CcScheduleLazyWriteScan(FALSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
NTSTATUS CcWaitForCurrentLazyWriterActivity()
|
|
||||||
{
|
|
||||||
NTSTATUS result;
|
|
||||||
PWORK_QUEUE_ENTRY WorkQueueEntry = nullptr;
|
|
||||||
KEVENT Event = {0};
|
|
||||||
KIRQL irql = {0};
|
|
||||||
|
|
||||||
result = CcAllocateWorkQueueEntry(&WorkQueueEntry);
|
|
||||||
if (NT_SUCCESS(result))
|
|
||||||
{
|
|
||||||
WorkQueueEntry->Function = SetDone;
|
|
||||||
KeInitializeEvent(&Event, NotificationEvent, FALSE);
|
|
||||||
WorkQueueEntry->Parameters.Notification.Reason = (ULONG_PTR)&Event;
|
|
||||||
|
|
||||||
if ((PerfGlobalGroupMask.Masks[4] & 0x20000) != 0)
|
|
||||||
CcPerfLogWorkItemEnqueue(&CcPostTickWorkQueue, WorkQueueEntry, 0, 0);
|
|
||||||
|
|
||||||
irql = KeAcquireQueuedSpinLock(LockQueueMasterLock);
|
|
||||||
|
|
||||||
WorkQueueEntry->WorkQueueLinks.Flink = &CcPostTickWorkQueue;
|
|
||||||
WorkQueueEntry->WorkQueueLinks.Blink = CcPostTickWorkQueue.Blink;
|
|
||||||
CcPostTickWorkQueue.Blink->Flink = &WorkQueueEntry->WorkQueueLinks;
|
|
||||||
CcPostTickWorkQueue.Blink = &WorkQueueEntry->WorkQueueLinks;
|
|
||||||
|
|
||||||
LazyWriter.OtherWork = 1;
|
|
||||||
_InterlockedIncrement(&CcPostTickWorkItemCount);
|
|
||||||
|
|
||||||
CcScheduleLazyWriteScan(1, 1);
|
|
||||||
|
|
||||||
KeReleaseQueuedSpinLock(LockQueueMasterLock, irql);
|
|
||||||
|
|
||||||
result = KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
|
|
||||||
|
|
||||||
_InterlockedDecrement(&CcPostTickWorkItemCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
VOID VECTORCALL CcReEngageWorkerThreads(
|
VOID VECTORCALL CcReEngageWorkerThreads(
|
||||||
ULONG NormalThreadsToActivate,
|
ULONG NormalThreadsToActivate,
|
||||||
ULONG ExtraWriteBehindThreadsToActivate
|
ULONG ExtraWriteBehindThreadsToActivate
|
||||||
@ -1281,6 +1244,62 @@ VOID VECTORCALL CcReEngageWorkerThreads(
|
|||||||
ExQueueWorkItem(currentExtraThreadEntry, CriticalWorkQueue);
|
ExQueueWorkItem(currentExtraThreadEntry, CriticalWorkQueue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
CcAdjustWriteBehindThreadPool(
|
||||||
|
IN BOOLEAN IsThreadPriorityLow)
|
||||||
|
{
|
||||||
|
if (IsThreadPriorityLow)
|
||||||
|
{
|
||||||
|
CcMaxNumberOfWriteBehindThreads = 1;
|
||||||
|
if (CcAddExtraWriteBehindThreads)
|
||||||
|
{
|
||||||
|
CcAddExtraWriteBehindThreads = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CcMaxNumberOfWriteBehindThreads = (ULONG)-1;
|
||||||
|
if (!IsListEmpty(&CcRegularWorkQueue) && !CcQueueThrottle)
|
||||||
|
{
|
||||||
|
CcReEngageWorkerThreads(CcNumberofWorkerThreads, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
CcAdjustWriteBehindThreadPoolIfNeeded(
|
||||||
|
IN BOOLEAN NeedAdjustment)
|
||||||
|
{
|
||||||
|
BOOLEAN NeedBoost = false;
|
||||||
|
KSPIN_LOCK_QUEUE_NUMBER queueNumber = LockQueueMasterLock;
|
||||||
|
SpinLockGuard guard(queueNumber);
|
||||||
|
|
||||||
|
if (CcPostTickWorkItemCount != 0)
|
||||||
|
{
|
||||||
|
if (CcIsWriteBehindThreadpoolAtLowPriority())
|
||||||
|
{
|
||||||
|
CcAdjustWriteBehindThreadPool(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (CcGlobalDirtyPageStatistics.DirtyPages > 0x2000 || NeedAdjustment)
|
||||||
|
{
|
||||||
|
if (CcIsWriteBehindThreadpoolAtLowPriority())
|
||||||
|
{
|
||||||
|
CcAdjustWriteBehindThreadPool(false);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!CcExecutingWriteBehindWorkItems && IsListEmpty(&CcRegularWorkQueue))
|
||||||
|
{
|
||||||
|
CcAdjustWriteBehindThreadPool(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
VOID
|
VOID
|
||||||
NTAPI
|
NTAPI
|
||||||
CcWorkerThread(PVOID Parameter)
|
CcWorkerThread(PVOID Parameter)
|
||||||
|
Loading…
Reference in New Issue
Block a user