sys: FspFsvolClose: convert CLOSE requests to synchronous when above the IOQ watermark

This commit is contained in:
Bill Zissimopoulos 2021-01-18 15:07:57 -08:00
parent 1dbcae3985
commit 0af0bfbe7c
No known key found for this signature in database
GPG Key ID: 3D4F95D52C7B3EA3
3 changed files with 14 additions and 2 deletions

View File

@ -84,8 +84,9 @@ static NTSTATUS FspFsvolClose(
FspFileDescDelete(FileDesc); /* this will also close the MainFileObject if any */ FspFileDescDelete(FileDesc); /* this will also close the MainFileObject if any */
FspFileNodeDereference(FileNode); FspFileNodeDereference(FileNode);
/* if we are closing files in the context of a rename make it synchronous */ /* if closing in the context of a rename or IOQ is above the watermark make it synchronous */
if (FspFsvolDeviceFileRenameIsAcquiredExclusive(FsvolDeviceObject)) if (FspFsvolDeviceFileRenameIsAcquiredExclusive(FsvolDeviceObject) ||
FspIoqPendingAboveWatermark(FspFsvolDeviceExtension(FsvolDeviceObject)->Ioq, 50))
{ {
/* acquire ownership of the Request */ /* acquire ownership of the Request */
Request->Hint = (UINT_PTR)Irp; Request->Hint = (UINT_PTR)Irp;

View File

@ -953,6 +953,7 @@ BOOLEAN FspIoqPostIrpEx(FSP_IOQ *Ioq, PIRP Irp, BOOLEAN BestEffort, NTSTATUS *PR
PIRP FspIoqNextPendingIrp(FSP_IOQ *Ioq, PIRP BoundaryIrp, PLARGE_INTEGER Timeout, PIRP FspIoqNextPendingIrp(FSP_IOQ *Ioq, PIRP BoundaryIrp, PLARGE_INTEGER Timeout,
PIRP CancellableIrp); PIRP CancellableIrp);
ULONG FspIoqPendingIrpCount(FSP_IOQ *Ioq); ULONG FspIoqPendingIrpCount(FSP_IOQ *Ioq);
BOOLEAN FspIoqPendingAboveWatermark(FSP_IOQ *Ioq, ULONG Watermark);
BOOLEAN FspIoqStartProcessingIrp(FSP_IOQ *Ioq, PIRP Irp); BOOLEAN FspIoqStartProcessingIrp(FSP_IOQ *Ioq, PIRP Irp);
PIRP FspIoqEndProcessingIrp(FSP_IOQ *Ioq, UINT_PTR IrpHint); PIRP FspIoqEndProcessingIrp(FSP_IOQ *Ioq, UINT_PTR IrpHint);
ULONG FspIoqProcessIrpCount(FSP_IOQ *Ioq); ULONG FspIoqProcessIrpCount(FSP_IOQ *Ioq);

View File

@ -643,6 +643,16 @@ ULONG FspIoqPendingIrpCount(FSP_IOQ *Ioq)
return Result; return Result;
} }
BOOLEAN FspIoqPendingAboveWatermark(FSP_IOQ *Ioq, ULONG Watermark)
{
BOOLEAN Result;
KIRQL Irql;
KeAcquireSpinLock(&Ioq->SpinLock, &Irql);
Result = Watermark < 100 * Ioq->PendingIrpCount / Ioq->PendingIrpCapacity;
KeReleaseSpinLock(&Ioq->SpinLock, Irql);
return Result;
}
BOOLEAN FspIoqStartProcessingIrp(FSP_IOQ *Ioq, PIRP Irp) BOOLEAN FspIoqStartProcessingIrp(FSP_IOQ *Ioq, PIRP Irp)
{ {
NTSTATUS Result; NTSTATUS Result;