[NTOSKRNL] Avoid private cache map allocation for the first handle
authorPierre Schweitzer <pierre@reactos.org>
Fri, 9 Feb 2018 20:52:41 +0000 (21:52 +0100)
committerPierre Schweitzer <pierre@reactos.org>
Fri, 9 Feb 2018 20:52:41 +0000 (21:52 +0100)
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.

ntoskrnl/cc/view.c
ntoskrnl/include/internal/cc.h

index d69b195..cf2d2c5 100644 (file)
@@ -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 */
index d34360a..5751ab6 100644 (file)
@@ -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;