sys: consolidate Timeout functionality (ioq.c not included)

This commit is contained in:
Bill Zissimopoulos 2016-02-26 14:02:36 -08:00
parent f29f415d0c
commit 46fa75a74d
4 changed files with 54 additions and 24 deletions

View File

@ -327,7 +327,7 @@ static NTSTATUS FspFsvolDeviceInit(PDEVICE_OBJECT DeviceObject)
FsvolDeviceExtension->InitDoneIoq = 1; FsvolDeviceExtension->InitDoneIoq = 1;
/* create our security meta cache */ /* create our security meta cache */
MetaTimeout.QuadPart = FsvolDeviceExtension->VolumeParams.FileInfoTimeout * 10000ULL; MetaTimeout.QuadPart = FspTimeoutFromMillis(FsvolDeviceExtension->VolumeParams.FileInfoTimeout);
/* convert millis to nanos */ /* convert millis to nanos */
Result = FspMetaCacheCreate( Result = FspMetaCacheCreate(
FspFsvolDeviceSecurityCacheCapacity, FspFsvolDeviceSecurityCacheItemSizeMax, &MetaTimeout, FspFsvolDeviceSecurityCacheCapacity, FspFsvolDeviceSecurityCacheItemSizeMax, &MetaTimeout,
@ -761,8 +761,7 @@ BOOLEAN FspFsvolTryGetVolumeInfo(PDEVICE_OBJECT DeviceObject, FSP_FSCTL_VOLUME_I
BOOLEAN Result; BOOLEAN Result;
KeAcquireSpinLock(&FsvolDeviceExtension->InfoSpinLock, &Irql); KeAcquireSpinLock(&FsvolDeviceExtension->InfoSpinLock, &Irql);
if (0 < FsvolDeviceExtension->InfoExpirationTime && if (FspExpirationTimeValid(FsvolDeviceExtension->InfoExpirationTime))
KeQueryInterruptTime() < FsvolDeviceExtension->InfoExpirationTime)
{ {
VolumeInfoNp = FsvolDeviceExtension->VolumeInfo; VolumeInfoNp = FsvolDeviceExtension->VolumeInfo;
Result = TRUE; Result = TRUE;
@ -785,12 +784,11 @@ VOID FspFsvolSetVolumeInfo(PDEVICE_OBJECT DeviceObject, const FSP_FSCTL_VOLUME_I
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject); FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject);
FSP_FSCTL_VOLUME_INFO VolumeInfoNp = *VolumeInfo; FSP_FSCTL_VOLUME_INFO VolumeInfoNp = *VolumeInfo;
KIRQL Irql; KIRQL Irql;
UINT64 FileInfoTimeout = FsvolDeviceExtension->VolumeParams.FileInfoTimeout * 10000ULL;
KeAcquireSpinLock(&FsvolDeviceExtension->InfoSpinLock, &Irql); KeAcquireSpinLock(&FsvolDeviceExtension->InfoSpinLock, &Irql);
FsvolDeviceExtension->VolumeInfo = VolumeInfoNp; FsvolDeviceExtension->VolumeInfo = VolumeInfoNp;
FsvolDeviceExtension->InfoExpirationTime = 0 != FileInfoTimeout ? FsvolDeviceExtension->InfoExpirationTime = FspExpirationTimeFromMillis(
KeQueryInterruptTime() + FileInfoTimeout : 0; FsvolDeviceExtension->VolumeParams.FileInfoTimeout);
KeReleaseSpinLock(&FsvolDeviceExtension->InfoSpinLock, Irql); KeReleaseSpinLock(&FsvolDeviceExtension->InfoSpinLock, Irql);
} }

View File

@ -326,6 +326,39 @@ ULONG FspHashMixPointer(PVOID Pointer)
#endif #endif
} }
/* timeouts */
#define FspTimeoutInfinity32 ((UINT32)-1L)
#define FspTimeoutInfinity64 ((UINT64)-1LL)
static inline
UINT64 FspTimeoutFromMillis(UINT32 Millis)
{
/* if Millis is 0 or -1 then sign-extend else 10000ULL * Millis */
return 1 >= Millis + 1 ? (INT64)(INT32)Millis : 10000ULL * Millis;
}
static inline
UINT64 FspExpirationTimeFromMillis(UINT32 Millis)
{
/* if Millis is 0 or -1 then sign-extend else KeQueryInterruptTime() + 10000ULL * Millis */
return 1 >= Millis + 1 ? (INT64)(INT32)Millis : KeQueryInterruptTime() + 10000ULL * Millis;
}
static inline
UINT64 FspExpirationTimeFromTimeout(UINT64 Timeout)
{
/* if Timeout is 0 or -1 then Timeout else KeQueryInterruptTime() + Timeout */
return 1 >= Timeout + 1 ? Timeout : KeQueryInterruptTime() + Timeout;
}
static inline
BOOLEAN FspExpirationTimeValid(UINT64 ExpirationTime)
{
/* if ExpirationTime is 0 or -1 then ExpirationTime else KeQueryInterruptTime() < ExpirationTime */
return 1 >= ExpirationTime + 1 ? (0 != ExpirationTime) : (KeQueryInterruptTime() < ExpirationTime);
}
static inline
BOOLEAN FspExpirationTimeValid2(UINT64 ExpirationTime, UINT64 CurrentTime)
{
return CurrentTime < ExpirationTime;
}
/* utility */ /* utility */
PVOID FspAllocatePoolMustSucceed(POOL_TYPE PoolType, SIZE_T Size, ULONG Tag); PVOID FspAllocatePoolMustSucceed(POOL_TYPE PoolType, SIZE_T Size, ULONG Tag);
PVOID FspAllocateIrpMustSucceed(CCHAR StackSize); PVOID FspAllocateIrpMustSucceed(CCHAR StackSize);
@ -704,9 +737,9 @@ VOID FspFileNodeDereference(FSP_FILE_NODE *FileNode)
FspFileNodeDelete(FileNode); FspFileNodeDelete(FileNode);
} }
VOID FspFileNodeAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags); VOID FspFileNodeAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags);
BOOLEAN FspFileNodeTryAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags); BOOLEAN FspFileNodeTryAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags, BOOLEAN Wait);
VOID FspFileNodeAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags); VOID FspFileNodeAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags);
BOOLEAN FspFileNodeTryAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags); BOOLEAN FspFileNodeTryAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags, BOOLEAN Wait);
VOID FspFileNodeSetOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner); VOID FspFileNodeSetOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner);
VOID FspFileNodeReleaseF(FSP_FILE_NODE *FileNode, ULONG Flags); VOID FspFileNodeReleaseF(FSP_FILE_NODE *FileNode, ULONG Flags);
VOID FspFileNodeReleaseOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner); VOID FspFileNodeReleaseOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner);
@ -728,9 +761,9 @@ BOOLEAN FspFileNodeTrySetSecurity(FSP_FILE_NODE *FileNode, PCVOID Buffer, ULONG
NTSTATUS FspFileDescCreate(FSP_FILE_DESC **PFileDesc); NTSTATUS FspFileDescCreate(FSP_FILE_DESC **PFileDesc);
VOID FspFileDescDelete(FSP_FILE_DESC *FileDesc); VOID FspFileDescDelete(FSP_FILE_DESC *FileDesc);
#define FspFileNodeAcquireShared(N,F) FspFileNodeAcquireSharedF(N, FspFileNodeAcquire ## F) #define FspFileNodeAcquireShared(N,F) FspFileNodeAcquireSharedF(N, FspFileNodeAcquire ## F)
#define FspFileNodeTryAcquireShared(N,F) FspFileNodeTryAcquireSharedF(N, FspFileNodeAcquire ## F) #define FspFileNodeTryAcquireShared(N,F) FspFileNodeTryAcquireSharedF(N, FspFileNodeAcquire ## F, FALSE)
#define FspFileNodeAcquireExclusive(N,F) FspFileNodeAcquireExclusiveF(N, FspFileNodeAcquire ## F) #define FspFileNodeAcquireExclusive(N,F) FspFileNodeAcquireExclusiveF(N, FspFileNodeAcquire ## F)
#define FspFileNodeTryAcquireExclusive(N,F) FspFileNodeTryAcquireExclusiveF(N, FspFileNodeAcquire ## F) #define FspFileNodeTryAcquireExclusive(N,F) FspFileNodeTryAcquireExclusiveF(N, FspFileNodeAcquire ## F, FALSE)
#define FspFileNodeSetOwner(N,F,P) FspFileNodeSetOwnerF(N, FspFileNodeAcquire ## F, P) #define FspFileNodeSetOwner(N,F,P) FspFileNodeSetOwnerF(N, FspFileNodeAcquire ## F, P)
#define FspFileNodeRelease(N,F) FspFileNodeReleaseF(N, FspFileNodeAcquire ## F) #define FspFileNodeRelease(N,F) FspFileNodeReleaseF(N, FspFileNodeAcquire ## F)
#define FspFileNodeReleaseOwner(N,F,P) FspFileNodeReleaseOwnerF(N, FspFileNodeAcquire ## F, P) #define FspFileNodeReleaseOwner(N,F,P) FspFileNodeReleaseOwnerF(N, FspFileNodeAcquire ## F, P)

View File

@ -10,9 +10,9 @@ NTSTATUS FspFileNodeCreate(PDEVICE_OBJECT DeviceObject,
ULONG ExtraSize, FSP_FILE_NODE **PFileNode); ULONG ExtraSize, FSP_FILE_NODE **PFileNode);
VOID FspFileNodeDelete(FSP_FILE_NODE *FileNode); VOID FspFileNodeDelete(FSP_FILE_NODE *FileNode);
VOID FspFileNodeAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags); VOID FspFileNodeAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags);
BOOLEAN FspFileNodeTryAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags); BOOLEAN FspFileNodeTryAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags, BOOLEAN Wait);
VOID FspFileNodeAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags); VOID FspFileNodeAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags);
BOOLEAN FspFileNodeTryAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags); BOOLEAN FspFileNodeTryAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags, BOOLEAN Wait);
VOID FspFileNodeSetOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner); VOID FspFileNodeSetOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner);
VOID FspFileNodeReleaseF(FSP_FILE_NODE *FileNode, ULONG Flags); VOID FspFileNodeReleaseF(FSP_FILE_NODE *FileNode, ULONG Flags);
VOID FspFileNodeReleaseOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner); VOID FspFileNodeReleaseOwnerF(FSP_FILE_NODE *FileNode, ULONG Flags, PVOID Owner);
@ -135,7 +135,7 @@ VOID FspFileNodeAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags)
ExAcquireResourceSharedLite(FileNode->Header.PagingIoResource, TRUE); ExAcquireResourceSharedLite(FileNode->Header.PagingIoResource, TRUE);
} }
BOOLEAN FspFileNodeTryAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags) BOOLEAN FspFileNodeTryAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags, BOOLEAN Wait)
{ {
PAGED_CODE(); PAGED_CODE();
@ -143,14 +143,14 @@ BOOLEAN FspFileNodeTryAcquireSharedF(FSP_FILE_NODE *FileNode, ULONG Flags)
if (Flags & FspFileNodeAcquireMain) if (Flags & FspFileNodeAcquireMain)
{ {
Result = ExAcquireResourceSharedLite(FileNode->Header.Resource, FALSE); Result = ExAcquireResourceSharedLite(FileNode->Header.Resource, Wait);
if (!Result) if (!Result)
return FALSE; return FALSE;
} }
if (Flags & FspFileNodeAcquirePgio) if (Flags & FspFileNodeAcquirePgio)
{ {
Result = ExAcquireResourceSharedLite(FileNode->Header.PagingIoResource, FALSE); Result = ExAcquireResourceSharedLite(FileNode->Header.PagingIoResource, Wait);
if (!Result) if (!Result)
{ {
if (Flags & FspFileNodeAcquireMain) if (Flags & FspFileNodeAcquireMain)
@ -173,7 +173,7 @@ VOID FspFileNodeAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags)
ExAcquireResourceExclusiveLite(FileNode->Header.PagingIoResource, TRUE); ExAcquireResourceExclusiveLite(FileNode->Header.PagingIoResource, TRUE);
} }
BOOLEAN FspFileNodeTryAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags) BOOLEAN FspFileNodeTryAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags, BOOLEAN Wait)
{ {
PAGED_CODE(); PAGED_CODE();
@ -181,14 +181,14 @@ BOOLEAN FspFileNodeTryAcquireExclusiveF(FSP_FILE_NODE *FileNode, ULONG Flags)
if (Flags & FspFileNodeAcquireMain) if (Flags & FspFileNodeAcquireMain)
{ {
Result = ExAcquireResourceExclusiveLite(FileNode->Header.Resource, FALSE); Result = ExAcquireResourceExclusiveLite(FileNode->Header.Resource, Wait);
if (!Result) if (!Result)
return FALSE; return FALSE;
} }
if (Flags & FspFileNodeAcquirePgio) if (Flags & FspFileNodeAcquirePgio)
{ {
Result = ExAcquireResourceExclusiveLite(FileNode->Header.PagingIoResource, FALSE); Result = ExAcquireResourceExclusiveLite(FileNode->Header.PagingIoResource, Wait);
if (!Result) if (!Result)
{ {
if (Flags & FspFileNodeAcquireMain) if (Flags & FspFileNodeAcquireMain)
@ -418,7 +418,7 @@ BOOLEAN FspFileNodeTryGetFileInfo(FSP_FILE_NODE *FileNode, FSP_FSCTL_FILE_INFO *
BOOLEAN Result; BOOLEAN Result;
if (0 < FileNode->InfoExpirationTime && KeQueryInterruptTime() < FileNode->InfoExpirationTime) if (FspExpirationTimeValid(FileNode->InfoExpirationTime))
{ {
FileInfo->AllocationSize = FileNode->Header.AllocationSize.QuadPart; FileInfo->AllocationSize = FileNode->Header.AllocationSize.QuadPart;
FileInfo->FileSize = FileNode->Header.FileSize.QuadPart; FileInfo->FileSize = FileNode->Header.FileSize.QuadPart;
@ -444,7 +444,6 @@ VOID FspFileNodeSetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension =
FspFsvolDeviceExtension(FileNode->FsvolDeviceObject); FspFsvolDeviceExtension(FileNode->FsvolDeviceObject);
UINT64 FileInfoTimeout = FsvolDeviceExtension->VolumeParams.FileInfoTimeout * 10000ULL;
UINT64 AllocationSize = FileInfo->AllocationSize > FileInfo->FileSize ? UINT64 AllocationSize = FileInfo->AllocationSize > FileInfo->FileSize ?
FileInfo->AllocationSize : FileInfo->FileSize; FileInfo->AllocationSize : FileInfo->FileSize;
UINT64 AllocationUnit; UINT64 AllocationUnit;
@ -462,8 +461,8 @@ VOID FspFileNodeSetFileInfo(FSP_FILE_NODE *FileNode, PFILE_OBJECT CcFileObject,
FileNode->LastAccessTime = FileInfo->LastAccessTime; FileNode->LastAccessTime = FileInfo->LastAccessTime;
FileNode->LastWriteTime = FileInfo->LastWriteTime; FileNode->LastWriteTime = FileInfo->LastWriteTime;
FileNode->ChangeTime = FileInfo->ChangeTime; FileNode->ChangeTime = FileInfo->ChangeTime;
FileNode->InfoExpirationTime = 0 != FileInfoTimeout ? FileNode->InfoExpirationTime = FspExpirationTimeFromMillis(
KeQueryInterruptTime() + FileInfoTimeout : 0; FsvolDeviceExtension->VolumeParams.FileInfoTimeout);
FileNode->InfoChangeNumber++; FileNode->InfoChangeNumber++;
if (0 != CcFileObject) if (0 != CcFileObject)

View File

@ -86,7 +86,7 @@ static inline FSP_META_CACHE_ITEM *FspMetaCacheRemoveExpiredItemAtDpcLevel(FSP_M
if (Head == Entry) if (Head == Entry)
return 0; return 0;
FSP_META_CACHE_ITEM *Item = CONTAINING_RECORD(Entry, FSP_META_CACHE_ITEM, ListEntry); FSP_META_CACHE_ITEM *Item = CONTAINING_RECORD(Entry, FSP_META_CACHE_ITEM, ListEntry);
if (Item->ExpirationTime > ExpirationTime) if (!FspExpirationTimeValid2(Item->ExpirationTime, ExpirationTime))
return 0; return 0;
ULONG HashIndex = Item->ItemIndex % MetaCache->ItemBucketCount; ULONG HashIndex = Item->ItemIndex % MetaCache->ItemBucketCount;
for (FSP_META_CACHE_ITEM **P = (PVOID)&MetaCache->ItemBuckets[HashIndex]; *P; P = &(*P)->DictNext) for (FSP_META_CACHE_ITEM **P = (PVOID)&MetaCache->ItemBuckets[HashIndex]; *P; P = &(*P)->DictNext)
@ -203,7 +203,7 @@ UINT64 FspMetaCacheAddItem(FSP_META_CACHE *MetaCache, PCVOID Buffer, ULONG Size)
RtlZeroMemory(Item, sizeof *Item); RtlZeroMemory(Item, sizeof *Item);
RtlZeroMemory(ItemBuffer, sizeof *ItemBuffer); RtlZeroMemory(ItemBuffer, sizeof *ItemBuffer);
Item->ItemBuffer = ItemBuffer; Item->ItemBuffer = ItemBuffer;
Item->ExpirationTime = KeQueryInterruptTime() + MetaCache->MetaTimeout; Item->ExpirationTime = FspExpirationTimeFromTimeout(MetaCache->MetaTimeout);
Item->RefCount = 1; Item->RefCount = 1;
ItemBuffer->Item = Item; ItemBuffer->Item = Item;
ItemBuffer->Size = Size; ItemBuffer->Size = Size;