From 0af0bfbe7c45e353d693a2a45965d99fa81f2163 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Mon, 18 Jan 2021 15:07:57 -0800 Subject: [PATCH] sys: FspFsvolClose: convert CLOSE requests to synchronous when above the IOQ watermark --- src/sys/close.c | 5 +++-- src/sys/driver.h | 1 + src/sys/ioq.c | 10 ++++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/sys/close.c b/src/sys/close.c index c3b061c1..2b5b189a 100644 --- a/src/sys/close.c +++ b/src/sys/close.c @@ -84,8 +84,9 @@ static NTSTATUS FspFsvolClose( FspFileDescDelete(FileDesc); /* this will also close the MainFileObject if any */ FspFileNodeDereference(FileNode); - /* if we are closing files in the context of a rename make it synchronous */ - if (FspFsvolDeviceFileRenameIsAcquiredExclusive(FsvolDeviceObject)) + /* if closing in the context of a rename or IOQ is above the watermark make it synchronous */ + if (FspFsvolDeviceFileRenameIsAcquiredExclusive(FsvolDeviceObject) || + FspIoqPendingAboveWatermark(FspFsvolDeviceExtension(FsvolDeviceObject)->Ioq, 50)) { /* acquire ownership of the Request */ Request->Hint = (UINT_PTR)Irp; diff --git a/src/sys/driver.h b/src/sys/driver.h index 2f0dc0a3..6a28394c 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -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 CancellableIrp); ULONG FspIoqPendingIrpCount(FSP_IOQ *Ioq); +BOOLEAN FspIoqPendingAboveWatermark(FSP_IOQ *Ioq, ULONG Watermark); BOOLEAN FspIoqStartProcessingIrp(FSP_IOQ *Ioq, PIRP Irp); PIRP FspIoqEndProcessingIrp(FSP_IOQ *Ioq, UINT_PTR IrpHint); ULONG FspIoqProcessIrpCount(FSP_IOQ *Ioq); diff --git a/src/sys/ioq.c b/src/sys/ioq.c index d07cad66..f5d58e24 100644 --- a/src/sys/ioq.c +++ b/src/sys/ioq.c @@ -643,6 +643,16 @@ ULONG FspIoqPendingIrpCount(FSP_IOQ *Ioq) 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) { NTSTATUS Result;