[NTOS:CC]

- Remove CacheSegmentSize
- Misc simplifications and style improvements
CORE-7491

svn path=/trunk/; revision=60484
This commit is contained in:
Thomas Faber 2013-09-30 20:06:18 +00:00
parent 5dafa70a30
commit dca12046f3
6 changed files with 57 additions and 58 deletions

View file

@ -19,6 +19,7 @@ static PFN_NUMBER CcZeroPage = 0;
#define MAX_ZERO_LENGTH (256 * 1024) #define MAX_ZERO_LENGTH (256 * 1024)
#define MAX_RW_LENGTH (256 * 1024) #define MAX_RW_LENGTH (256 * 1024)
C_ASSERT(MAX_RW_LENGTH <= VACB_MAPPING_GRANULARITY);
ULONG CcFastMdlReadWait; ULONG CcFastMdlReadWait;
ULONG CcFastMdlReadNotPossible; ULONG CcFastMdlReadNotPossible;
@ -88,7 +89,7 @@ ReadCacheSegmentChain (
if (current->Valid) if (current->Valid)
{ {
TempLength = min(VACB_MAPPING_GRANULARITY, Length); TempLength = min(VACB_MAPPING_GRANULARITY, Length);
memcpy(Buffer, current->BaseAddress, TempLength); RtlCopyMemory(Buffer, current->BaseAddress, TempLength);
Buffer = (PVOID)((ULONG_PTR)Buffer + TempLength); Buffer = (PVOID)((ULONG_PTR)Buffer + TempLength);
@ -130,7 +131,7 @@ ReadCacheSegmentChain (
while ((current2 != NULL) && !current2->Valid && (current_size < MAX_RW_LENGTH)) while ((current2 != NULL) && !current2->Valid && (current_size < MAX_RW_LENGTH))
{ {
PVOID address = current2->BaseAddress; PVOID address = current2->BaseAddress;
for (i = 0; i < (VACB_MAPPING_GRANULARITY / PAGE_SIZE); i++, address = RVA(address, PAGE_SIZE)) for (i = 0; i < VACB_MAPPING_GRANULARITY / PAGE_SIZE; i++, address = RVA(address, PAGE_SIZE))
{ {
*MdlPages++ = MmGetPfnForProcess(NULL, address); *MdlPages++ = MmGetPfnForProcess(NULL, address);
} }
@ -173,7 +174,7 @@ ReadCacheSegmentChain (
previous = current; previous = current;
current = current->NextInChain; current = current->NextInChain;
TempLength = min(VACB_MAPPING_GRANULARITY, Length); TempLength = min(VACB_MAPPING_GRANULARITY, Length);
memcpy(Buffer, previous->BaseAddress, TempLength); RtlCopyMemory(Buffer, previous->BaseAddress, TempLength);
Buffer = (PVOID)((ULONG_PTR)Buffer + TempLength); Buffer = (PVOID)((ULONG_PTR)Buffer + TempLength);
@ -229,7 +230,7 @@ ReadCacheSegment (
return Status; return Status;
} }
if (VACB_MAPPING_GRANULARITY > Size) if (Size < VACB_MAPPING_GRANULARITY)
{ {
RtlZeroMemory((char*)CacheSeg->BaseAddress + Size, RtlZeroMemory((char*)CacheSeg->BaseAddress + Size,
VACB_MAPPING_GRANULARITY - Size); VACB_MAPPING_GRANULARITY - Size);
@ -381,10 +382,10 @@ CcCopyRead (
TempLength = ReadOffset % VACB_MAPPING_GRANULARITY; TempLength = ReadOffset % VACB_MAPPING_GRANULARITY;
if (TempLength != 0) if (TempLength != 0)
{ {
TempLength = min (Length, VACB_MAPPING_GRANULARITY - TempLength); TempLength = min(Length, VACB_MAPPING_GRANULARITY - TempLength);
Status = CcRosRequestCacheSegment(Bcb, Status = CcRosRequestCacheSegment(Bcb,
ROUND_DOWN(ReadOffset, ROUND_DOWN(ReadOffset,
VACB_MAPPING_GRANULARITY), VACB_MAPPING_GRANULARITY),
&BaseAddress, &Valid, &CacheSeg); &BaseAddress, &Valid, &CacheSeg);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
@ -404,8 +405,9 @@ CcCopyRead (
return FALSE; return FALSE;
} }
} }
memcpy (Buffer, (char*)BaseAddress + ReadOffset % VACB_MAPPING_GRANULARITY, RtlCopyMemory(Buffer,
TempLength); (char*)BaseAddress + ReadOffset % VACB_MAPPING_GRANULARITY,
TempLength);
CcRosReleaseCacheSegment(Bcb, CacheSeg, TRUE, FALSE, FALSE); CcRosReleaseCacheSegment(Bcb, CacheSeg, TRUE, FALSE, FALSE);
ReadLength += TempLength; ReadLength += TempLength;
Length -= TempLength; Length -= TempLength;
@ -415,7 +417,7 @@ CcCopyRead (
while (Length > 0) while (Length > 0)
{ {
TempLength = min(max(VACB_MAPPING_GRANULARITY, MAX_RW_LENGTH), Length); TempLength = min(VACB_MAPPING_GRANULARITY, Length);
Status = ReadCacheSegmentChain(Bcb, ReadOffset, TempLength, Buffer); Status = ReadCacheSegmentChain(Bcb, ReadOffset, TempLength, Buffer);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
@ -498,7 +500,7 @@ CcCopyWrite (
{ {
ULONG ROffset; ULONG ROffset;
ROffset = ROUND_DOWN(WriteOffset, VACB_MAPPING_GRANULARITY); ROffset = ROUND_DOWN(WriteOffset, VACB_MAPPING_GRANULARITY);
TempLength = min (Length, VACB_MAPPING_GRANULARITY - TempLength); TempLength = min(Length, VACB_MAPPING_GRANULARITY - TempLength);
Status = CcRosRequestCacheSegment(Bcb, ROffset, Status = CcRosRequestCacheSegment(Bcb, ROffset,
&BaseAddress, &Valid, &CacheSeg); &BaseAddress, &Valid, &CacheSeg);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
@ -512,8 +514,9 @@ CcCopyWrite (
return FALSE; return FALSE;
} }
} }
memcpy ((char*)BaseAddress + WriteOffset % VACB_MAPPING_GRANULARITY, RtlCopyMemory((char*)BaseAddress + WriteOffset % VACB_MAPPING_GRANULARITY,
Buffer, TempLength); Buffer,
TempLength);
CcRosReleaseCacheSegment(Bcb, CacheSeg, TRUE, TRUE, FALSE); CcRosReleaseCacheSegment(Bcb, CacheSeg, TRUE, TRUE, FALSE);
Length -= TempLength; Length -= TempLength;
@ -524,7 +527,7 @@ CcCopyWrite (
while (Length > 0) while (Length > 0)
{ {
TempLength = min (VACB_MAPPING_GRANULARITY, Length); TempLength = min(VACB_MAPPING_GRANULARITY, Length);
Status = CcRosRequestCacheSegment(Bcb, Status = CcRosRequestCacheSegment(Bcb,
WriteOffset, WriteOffset,
&BaseAddress, &BaseAddress,
@ -542,7 +545,7 @@ CcCopyWrite (
return FALSE; return FALSE;
} }
} }
memcpy (BaseAddress, Buffer, TempLength); RtlCopyMemory(BaseAddress, Buffer, TempLength);
CcRosReleaseCacheSegment(Bcb, CacheSeg, TRUE, TRUE, FALSE); CcRosReleaseCacheSegment(Bcb, CacheSeg, TRUE, TRUE, FALSE);
Length -= TempLength; Length -= TempLength;
WriteOffset += TempLength; WriteOffset += TempLength;
@ -749,13 +752,14 @@ CcZeroData (
Status); Status);
} }
} }
TempLength = min (CurrentLength, VACB_MAPPING_GRANULARITY - Offset); TempLength = min(CurrentLength, VACB_MAPPING_GRANULARITY - Offset);
} }
else else
{ {
TempLength = VACB_MAPPING_GRANULARITY; TempLength = VACB_MAPPING_GRANULARITY;
} }
memset ((PUCHAR)current->BaseAddress + Offset, 0, TempLength); RtlZeroMemory((PUCHAR)current->BaseAddress + Offset,
TempLength);
WriteOffset.QuadPart += TempLength; WriteOffset.QuadPart += TempLength;
CurrentLength -= TempLength; CurrentLength -= TempLength;

View file

@ -87,7 +87,7 @@ CcInitializeCacheMap (
/* Call old ROS cache init function */ /* Call old ROS cache init function */
CcRosInitializeFileCache(FileObject, CcRosInitializeFileCache(FileObject,
/*PAGE_SIZE*/ VACB_MAPPING_GRANULARITY, CallBacks, CallBacks,
LazyWriterContext); LazyWriterContext);
} }

View file

@ -88,7 +88,7 @@ CcMapData (
} }
} }
*pBuffer = (PVOID)((ULONG_PTR)(*pBuffer) + (ReadOffset % VACB_MAPPING_GRANULARITY)); *pBuffer = (PVOID)((ULONG_PTR)(*pBuffer) + ReadOffset % VACB_MAPPING_GRANULARITY);
iBcb = ExAllocateFromNPagedLookasideList(&iBcbLookasideList); iBcb = ExAllocateFromNPagedLookasideList(&iBcbLookasideList);
if (iBcb == NULL) if (iBcb == NULL)
{ {
@ -96,7 +96,7 @@ CcMapData (
return FALSE; return FALSE;
} }
memset(iBcb, 0, sizeof(INTERNAL_BCB)); RtlZeroMemory(iBcb, sizeof(*iBcb));
iBcb->PFCB.NodeTypeCode = 0xDE45; /* Undocumented (CAPTIVE_PUBLIC_BCB_NODETYPECODE) */ iBcb->PFCB.NodeTypeCode = 0xDE45; /* Undocumented (CAPTIVE_PUBLIC_BCB_NODETYPECODE) */
iBcb->PFCB.NodeByteSize = sizeof(PUBLIC_BCB); iBcb->PFCB.NodeByteSize = sizeof(PUBLIC_BCB);
iBcb->PFCB.MappedLength = Length; iBcb->PFCB.MappedLength = Length;

View file

@ -53,7 +53,7 @@ static LIST_ENTRY DirtySegmentListHead;
static LIST_ENTRY CacheSegmentListHead; static LIST_ENTRY CacheSegmentListHead;
static LIST_ENTRY CacheSegmentLRUListHead; static LIST_ENTRY CacheSegmentLRUListHead;
static LIST_ENTRY ClosedListHead; static LIST_ENTRY ClosedListHead;
ULONG DirtyPageCount=0; ULONG DirtyPageCount = 0;
KGUARDED_MUTEX ViewLock; KGUARDED_MUTEX ViewLock;
@ -171,7 +171,7 @@ CcRosFlushCacheSegment (
KeReleaseGuardedMutex(&ViewLock); KeReleaseGuardedMutex(&ViewLock);
} }
return(Status); return Status;
} }
NTSTATUS NTSTATUS
@ -273,7 +273,7 @@ CcRosFlushDirtyPages (
KeLeaveCriticalRegion(); KeLeaveCriticalRegion();
DPRINT("CcRosFlushDirtyPages() finished\n"); DPRINT("CcRosFlushDirtyPages() finished\n");
return(STATUS_SUCCESS); return STATUS_SUCCESS;
} }
NTSTATUS NTSTATUS
@ -396,7 +396,7 @@ retry:
DPRINT("Evicted %lu cache pages\n", (*NrFreed)); DPRINT("Evicted %lu cache pages\n", (*NrFreed));
return(STATUS_SUCCESS); return STATUS_SUCCESS;
} }
NTSTATUS NTSTATUS
@ -448,7 +448,7 @@ CcRosReleaseCacheSegment (
KeReleaseGuardedMutex(&ViewLock); KeReleaseGuardedMutex(&ViewLock);
KeReleaseMutex(&CacheSeg->Mutex, FALSE); KeReleaseMutex(&CacheSeg->Mutex, FALSE);
return(STATUS_SUCCESS); return STATUS_SUCCESS;
} }
/* Returns with Cache Segment Lock Held! */ /* Returns with Cache Segment Lock Held! */
@ -540,7 +540,7 @@ CcRosMarkDirtyCacheSegment (
KeReleaseGuardedMutex(&ViewLock); KeReleaseGuardedMutex(&ViewLock);
KeReleaseMutex(&CacheSeg->Mutex, FALSE); KeReleaseMutex(&CacheSeg->Mutex, FALSE);
return(STATUS_SUCCESS); return STATUS_SUCCESS;
} }
NTSTATUS NTSTATUS
@ -562,7 +562,7 @@ CcRosUnmapCacheSegment (
CacheSeg = CcRosLookupCacheSegment(Bcb, FileOffset); CacheSeg = CcRosLookupCacheSegment(Bcb, FileOffset);
if (CacheSeg == NULL) if (CacheSeg == NULL)
{ {
return(STATUS_UNSUCCESSFUL); return STATUS_UNSUCCESSFUL;
} }
KeAcquireGuardedMutex(&ViewLock); KeAcquireGuardedMutex(&ViewLock);
@ -593,7 +593,7 @@ CcRosUnmapCacheSegment (
KeReleaseGuardedMutex(&ViewLock); KeReleaseGuardedMutex(&ViewLock);
KeReleaseMutex(&CacheSeg->Mutex, FALSE); KeReleaseMutex(&CacheSeg->Mutex, FALSE);
return(STATUS_SUCCESS); return STATUS_SUCCESS;
} }
static static
@ -713,7 +713,9 @@ CcRosCreateCacheSegment (
#ifdef CACHE_BITMAP #ifdef CACHE_BITMAP
KeAcquireSpinLock(&CiCacheSegMappingRegionLock, &oldIrql); KeAcquireSpinLock(&CiCacheSegMappingRegionLock, &oldIrql);
StartingOffset = RtlFindClearBitsAndSet(&CiCacheSegMappingRegionAllocMap, VACB_MAPPING_GRANULARITY / PAGE_SIZE, CiCacheSegMappingRegionHint); StartingOffset = RtlFindClearBitsAndSet(&CiCacheSegMappingRegionAllocMap,
VACB_MAPPING_GRANULARITY / PAGE_SIZE,
CiCacheSegMappingRegionHint);
if (StartingOffset == 0xffffffff) if (StartingOffset == 0xffffffff)
{ {
@ -764,7 +766,7 @@ CcRosCreateCacheSegment (
MmMapMemoryArea(current->BaseAddress, VACB_MAPPING_GRANULARITY, MmMapMemoryArea(current->BaseAddress, VACB_MAPPING_GRANULARITY,
MC_CACHE, PAGE_READWRITE); MC_CACHE, PAGE_READWRITE);
return(STATUS_SUCCESS); return STATUS_SUCCESS;
} }
NTSTATUS NTSTATUS
@ -815,7 +817,7 @@ CcRosGetCacheSegmentChain (
} }
} }
for (i = 0; i < (Length / VACB_MAPPING_GRANULARITY); i++) for (i = 0; i < Length / VACB_MAPPING_GRANULARITY; i++)
{ {
if (i == 0) if (i == 0)
{ {
@ -831,7 +833,7 @@ CcRosGetCacheSegmentChain (
ASSERT(Previous); ASSERT(Previous);
Previous->NextInChain = NULL; Previous->NextInChain = NULL;
return(STATUS_SUCCESS); return STATUS_SUCCESS;
} }
NTSTATUS NTSTATUS
@ -883,7 +885,7 @@ CcRosGetCacheSegment (
DPRINT("*BaseAddress %p\n", *BaseAddress); DPRINT("*BaseAddress %p\n", *BaseAddress);
*CacheSeg = current; *CacheSeg = current;
*BaseOffset = current->FileOffset; *BaseOffset = current->FileOffset;
return(STATUS_SUCCESS); return STATUS_SUCCESS;
} }
NTSTATUS NTSTATUS
@ -902,19 +904,19 @@ CcRosRequestCacheSegment (
ASSERT(Bcb); ASSERT(Bcb);
if ((FileOffset % VACB_MAPPING_GRANULARITY) != 0) if (FileOffset % VACB_MAPPING_GRANULARITY != 0)
{ {
DPRINT1("Bad fileoffset %x should be multiple of %x", DPRINT1("Bad fileoffset %x should be multiple of %x",
FileOffset, VACB_MAPPING_GRANULARITY); FileOffset, VACB_MAPPING_GRANULARITY);
KeBugCheck(CACHE_MANAGER); KeBugCheck(CACHE_MANAGER);
} }
return(CcRosGetCacheSegment(Bcb, return CcRosGetCacheSegment(Bcb,
FileOffset, FileOffset,
&BaseOffset, &BaseOffset,
BaseAddress, BaseAddress,
UptoDate, UptoDate,
CacheSeg)); CacheSeg);
} }
#ifdef CACHE_BITMAP #ifdef CACHE_BITMAP
#else #else
@ -977,7 +979,7 @@ CcRosInternalFreeCacheSegment (
RtlClearBits(&CiCacheSegMappingRegionAllocMap, Base, RegionSize); RtlClearBits(&CiCacheSegMappingRegionAllocMap, Base, RegionSize);
CiCacheSegMappingRegionHint = min (CiCacheSegMappingRegionHint, Base); CiCacheSegMappingRegionHint = min(CiCacheSegMappingRegionHint, Base);
KeReleaseSpinLock(&CiCacheSegMappingRegionLock, oldIrql); KeReleaseSpinLock(&CiCacheSegMappingRegionLock, oldIrql);
#else #else
@ -989,7 +991,7 @@ CcRosInternalFreeCacheSegment (
MmUnlockAddressSpace(MmGetKernelAddressSpace()); MmUnlockAddressSpace(MmGetKernelAddressSpace());
#endif #endif
ExFreeToNPagedLookasideList(&CacheSegLookasideList, CacheSeg); ExFreeToNPagedLookasideList(&CacheSegLookasideList, CacheSeg);
return(STATUS_SUCCESS); return STATUS_SUCCESS;
} }
/* /*
@ -1143,7 +1145,7 @@ CcRosDeleteFileCache (
ExFreeToNPagedLookasideList(&BcbLookasideList, Bcb); ExFreeToNPagedLookasideList(&BcbLookasideList, Bcb);
KeAcquireGuardedMutex(&ViewLock); KeAcquireGuardedMutex(&ViewLock);
} }
return(STATUS_SUCCESS); return STATUS_SUCCESS;
} }
VOID VOID
@ -1243,7 +1245,7 @@ CcRosReleaseFileCache (
} }
} }
KeReleaseGuardedMutex(&ViewLock); KeReleaseGuardedMutex(&ViewLock);
return(STATUS_SUCCESS); return STATUS_SUCCESS;
} }
NTSTATUS NTSTATUS
@ -1286,7 +1288,6 @@ NTSTATUS
NTAPI NTAPI
CcRosInitializeFileCache ( CcRosInitializeFileCache (
PFILE_OBJECT FileObject, PFILE_OBJECT FileObject,
ULONG CacheSegmentSize,
PCACHE_MANAGER_CALLBACKS CallBacks, PCACHE_MANAGER_CALLBACKS CallBacks,
PVOID LazyWriterContext) PVOID LazyWriterContext)
/* /*
@ -1296,8 +1297,8 @@ CcRosInitializeFileCache (
PBCB Bcb; PBCB Bcb;
Bcb = FileObject->SectionObjectPointer->SharedCacheMap; Bcb = FileObject->SectionObjectPointer->SharedCacheMap;
DPRINT("CcRosInitializeFileCache(FileObject 0x%p, Bcb 0x%p, CacheSegmentSize %lu)\n", DPRINT("CcRosInitializeFileCache(FileObject 0x%p, Bcb 0x%p)\n",
FileObject, Bcb, CacheSegmentSize); FileObject, Bcb);
KeAcquireGuardedMutex(&ViewLock); KeAcquireGuardedMutex(&ViewLock);
if (Bcb == NULL) if (Bcb == NULL)
@ -1306,15 +1307,14 @@ CcRosInitializeFileCache (
if (Bcb == NULL) if (Bcb == NULL)
{ {
KeReleaseGuardedMutex(&ViewLock); KeReleaseGuardedMutex(&ViewLock);
return(STATUS_UNSUCCESSFUL); return STATUS_UNSUCCESSFUL;
} }
memset(Bcb, 0, sizeof(BCB)); RtlZeroMemory(Bcb, sizeof(*Bcb));
ObReferenceObjectByPointer(FileObject, ObReferenceObjectByPointer(FileObject,
FILE_ALL_ACCESS, FILE_ALL_ACCESS,
NULL, NULL,
KernelMode); KernelMode);
Bcb->FileObject = FileObject; Bcb->FileObject = FileObject;
Bcb->CacheSegmentSize = CacheSegmentSize;
Bcb->Callbacks = CallBacks; Bcb->Callbacks = CallBacks;
Bcb->LazyWriteContext = LazyWriterContext; Bcb->LazyWriteContext = LazyWriterContext;
if (FileObject->FsContext) if (FileObject->FsContext)
@ -1340,7 +1340,7 @@ CcRosInitializeFileCache (
} }
KeReleaseGuardedMutex(&ViewLock); KeReleaseGuardedMutex(&ViewLock);
return(STATUS_SUCCESS); return STATUS_SUCCESS;
} }
/* /*
@ -1396,13 +1396,17 @@ CcInitView (
KeBugCheck(CACHE_MANAGER); KeBugCheck(CACHE_MANAGER);
} }
Buffer = ExAllocatePool(NonPagedPool, CI_CACHESEG_MAPPING_REGION_SIZE / (PAGE_SIZE * 8)); Buffer = ExAllocatePoolWithTag(NonPagedPool,
CI_CACHESEG_MAPPING_REGION_SIZE / (PAGE_SIZE * 8),
TAG_CC);
if (!Buffer) if (!Buffer)
{ {
KeBugCheck(CACHE_MANAGER); KeBugCheck(CACHE_MANAGER);
} }
RtlInitializeBitMap(&CiCacheSegMappingRegionAllocMap, Buffer, CI_CACHESEG_MAPPING_REGION_SIZE / PAGE_SIZE); RtlInitializeBitMap(&CiCacheSegMappingRegionAllocMap,
Buffer,
CI_CACHESEG_MAPPING_REGION_SIZE / PAGE_SIZE);
RtlClearAllBits(&CiCacheSegMappingRegionAllocMap); RtlClearAllBits(&CiCacheSegMappingRegionAllocMap);
KeInitializeSpinLock(&CiCacheSegMappingRegionLock); KeInitializeSpinLock(&CiCacheSegMappingRegionLock);
@ -1441,11 +1445,3 @@ CcInitView (
} }
/* EOF */ /* EOF */

View file

@ -108,7 +108,6 @@ typedef struct _BCB
BOOLEAN RemoveOnClose; BOOLEAN RemoveOnClose;
ULONG TimeStamp; ULONG TimeStamp;
PFILE_OBJECT FileObject; PFILE_OBJECT FileObject;
ULONG CacheSegmentSize;
LARGE_INTEGER AllocationSize; LARGE_INTEGER AllocationSize;
LARGE_INTEGER FileSize; LARGE_INTEGER FileSize;
PCACHE_MANAGER_CALLBACKS Callbacks; PCACHE_MANAGER_CALLBACKS Callbacks;
@ -294,7 +293,6 @@ NTSTATUS
NTAPI NTAPI
CcRosInitializeFileCache( CcRosInitializeFileCache(
PFILE_OBJECT FileObject, PFILE_OBJECT FileObject,
ULONG CacheSegmentSize,
PCACHE_MANAGER_CALLBACKS CallBacks, PCACHE_MANAGER_CALLBACKS CallBacks,
PVOID LazyWriterContext PVOID LazyWriterContext
); );

View file

@ -1,6 +1,7 @@
#pragma once #pragma once
/* formerly located in cc/view.c */ /* formerly located in cc/view.c */
#define TAG_CC ' cC'
#define TAG_CSEG 'GESC' #define TAG_CSEG 'GESC'
#define TAG_BCB ' BCB' #define TAG_BCB ' BCB'
#define TAG_IBCB 'BCBi' #define TAG_IBCB 'BCBi'