From: Pierre Schweitzer Date: Fri, 9 Feb 2018 20:52:41 +0000 (+0100) Subject: [NTOSKRNL] Avoid private cache map allocation for the first handle X-Git-Tag: 0.4.9-dev~43 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=a6e080bd3db21d64f1b43222377bb9c70e805857 [NTOSKRNL] Avoid private cache map allocation for the first handle Standard shared cache map provides space for a private cache map, do the same and make it available for the first handle. It avoids two allocations in a row. --- diff --git a/ntoskrnl/cc/view.c b/ntoskrnl/cc/view.c index d69b195c109..cf2d2c5cb75 100644 --- a/ntoskrnl/cc/view.c +++ b/ntoskrnl/cc/view.c @@ -1194,7 +1194,14 @@ CcRosReleaseFileCache ( KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, OldIrql); /* And free it. */ - ExFreePoolWithTag(PrivateMap, TAG_PRIVATE_CACHE_MAP); + if (PrivateMap != &SharedCacheMap->PrivateCacheMap) + { + ExFreePoolWithTag(PrivateMap, TAG_PRIVATE_CACHE_MAP); + } + else + { + PrivateMap->NodeTypeCode = 0; + } if (SharedCacheMap->OpenCount > 0) { @@ -1271,7 +1278,15 @@ CcRosInitializeFileCache ( PPRIVATE_CACHE_MAP PrivateMap; /* Allocate the private cache map for this handle */ - PrivateMap = ExAllocatePoolWithTag(NonPagedPool, sizeof(PRIVATE_CACHE_MAP), TAG_PRIVATE_CACHE_MAP); + if (SharedCacheMap->PrivateCacheMap.NodeTypeCode != 0) + { + PrivateMap = ExAllocatePoolWithTag(NonPagedPool, sizeof(PRIVATE_CACHE_MAP), TAG_PRIVATE_CACHE_MAP); + } + else + { + PrivateMap = &SharedCacheMap->PrivateCacheMap; + } + if (PrivateMap == NULL) { /* If we also allocated the shared cache map for this file, kill it */ diff --git a/ntoskrnl/include/internal/cc.h b/ntoskrnl/include/internal/cc.h index d34360a7e35..5751ab665e3 100644 --- a/ntoskrnl/include/internal/cc.h +++ b/ntoskrnl/include/internal/cc.h @@ -169,6 +169,7 @@ typedef struct _ROS_SHARED_CACHE_MAP PVOID LazyWriteContext; LIST_ENTRY PrivateList; ULONG DirtyPageThreshold; + PRIVATE_CACHE_MAP PrivateCacheMap; /* ROS specific */ LIST_ENTRY CacheMapVacbListHead;