[CACHE]
The cache manager rewrite I started years ago has finally appeared in
ReactOS' trunk and although at this point it's not quite perfectly
integrated, it's enough to boot up the bootcd or livecd. To check out
the more mature original, check out arty-newcc-reactos, branch
arty-newcc on bitbucket.org . Amine Khaldi encouraged me quite a bit
to not give up on it, and was able to reach out and be an advocate
when i really wasn't able to. Others agree that the time has come to
begin removing the old cache manager. I expect the remaining problems
in the version going to trunk will be taken care of relatively
quickly.
The motivation for this effort lies in the particularly hairy
relationship between ReactOS' cache manager and data sections. This
code completely removes page sharing between cache manager and section
and reimagines cache manager as being a facility layered on the memory
manager, not really caring about individual pages, but simply managing
data section objects where caching might occur.
It took me about 2 years to do the first pass of this rewrite and most
of this year to fix some lingering issues, properly implement demand
paging in ReactOS (code which didn't come with this patch in a
recognizable form), and finish getting the PrivateCacheMap and
SharedCacheMap relationship correct.
Currently, the new ntoskrnl/cache directory contains an own
implementation of data file sections. After things have settled down,
we can begin to deprecate and remove the parts of ReactOS' section
implementation that depend on a close relationship with cache
manager. Eventually, I think that the extra code added to
ntoskrnl/cache/section will be removed and ReactOS' own sections will
replace the use of the special MM_CACHE_SECTION_SEGMENT in the cache
path.
Note also, that this makes all cache manager (and new section parts)
use wide file offsets. If my section code were to take over other
parts of the ReactOS memory manager, they would also benefit from
these improvements.
I invite anyone who wants to to peek at this code and fix whatever
bugs can be found.
svn path=/trunk/; revision=49423
2010-11-02 02:32:39 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
struct _MM_CACHE_SECTION_SEGMENT;
|
|
|
|
|
|
|
|
typedef struct _NOCC_BCB
|
|
|
|
{
|
|
|
|
/* Public part */
|
|
|
|
PUBLIC_BCB Bcb;
|
|
|
|
|
|
|
|
struct _NOCC_CACHE_MAP *Map;
|
|
|
|
struct _MM_CACHE_SECTION_SEGMENT *SectionObject;
|
|
|
|
LARGE_INTEGER FileOffset;
|
|
|
|
ULONG Length;
|
|
|
|
PVOID BaseAddress;
|
|
|
|
BOOLEAN Dirty;
|
|
|
|
PVOID OwnerPointer;
|
|
|
|
|
|
|
|
/* Reference counts */
|
|
|
|
ULONG RefCount;
|
|
|
|
|
|
|
|
LIST_ENTRY ThisFileList;
|
|
|
|
|
|
|
|
KEVENT ExclusiveWait;
|
|
|
|
ULONG ExclusiveWaiter;
|
|
|
|
BOOLEAN Exclusive;
|
|
|
|
} NOCC_BCB, *PNOCC_BCB;
|
|
|
|
|
|
|
|
typedef struct _NOCC_CACHE_MAP
|
|
|
|
{
|
|
|
|
LIST_ENTRY Entry;
|
|
|
|
LIST_ENTRY AssociatedBcb;
|
|
|
|
LIST_ENTRY PrivateCacheMaps;
|
|
|
|
ULONG NumberOfMaps;
|
|
|
|
ULONG RefCount;
|
|
|
|
CC_FILE_SIZES FileSizes;
|
|
|
|
CACHE_MANAGER_CALLBACKS Callbacks;
|
|
|
|
PVOID LazyContext;
|
|
|
|
PVOID LogHandle;
|
|
|
|
PFLUSH_TO_LSN FlushToLsn;
|
|
|
|
ULONG ReadAheadGranularity;
|
|
|
|
} NOCC_CACHE_MAP, *PNOCC_CACHE_MAP;
|
|
|
|
|
|
|
|
VOID
|
|
|
|
NTAPI
|
|
|
|
CcPfInitializePrefetcher(
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
NTAPI
|
|
|
|
CcMdlReadComplete2(
|
|
|
|
IN PMDL MemoryDescriptorList,
|
|
|
|
IN PFILE_OBJECT FileObject
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
NTAPI
|
|
|
|
CcMdlWriteComplete2(
|
|
|
|
IN PFILE_OBJECT FileObject,
|
|
|
|
IN PLARGE_INTEGER FileOffset,
|
|
|
|
IN PMDL MdlChain
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
NTAPI
|
|
|
|
CcInitView(VOID);
|
|
|
|
|
2010-12-23 08:42:51 +00:00
|
|
|
BOOLEAN
|
[CACHE]
The cache manager rewrite I started years ago has finally appeared in
ReactOS' trunk and although at this point it's not quite perfectly
integrated, it's enough to boot up the bootcd or livecd. To check out
the more mature original, check out arty-newcc-reactos, branch
arty-newcc on bitbucket.org . Amine Khaldi encouraged me quite a bit
to not give up on it, and was able to reach out and be an advocate
when i really wasn't able to. Others agree that the time has come to
begin removing the old cache manager. I expect the remaining problems
in the version going to trunk will be taken care of relatively
quickly.
The motivation for this effort lies in the particularly hairy
relationship between ReactOS' cache manager and data sections. This
code completely removes page sharing between cache manager and section
and reimagines cache manager as being a facility layered on the memory
manager, not really caring about individual pages, but simply managing
data section objects where caching might occur.
It took me about 2 years to do the first pass of this rewrite and most
of this year to fix some lingering issues, properly implement demand
paging in ReactOS (code which didn't come with this patch in a
recognizable form), and finish getting the PrivateCacheMap and
SharedCacheMap relationship correct.
Currently, the new ntoskrnl/cache directory contains an own
implementation of data file sections. After things have settled down,
we can begin to deprecate and remove the parts of ReactOS' section
implementation that depend on a close relationship with cache
manager. Eventually, I think that the extra code added to
ntoskrnl/cache/section will be removed and ReactOS' own sections will
replace the use of the special MM_CACHE_SECTION_SEGMENT in the cache
path.
Note also, that this makes all cache manager (and new section parts)
use wide file offsets. If my section code were to take over other
parts of the ReactOS memory manager, they would also benefit from
these improvements.
I invite anyone who wants to to peek at this code and fix whatever
bugs can be found.
svn path=/trunk/; revision=49423
2010-11-02 02:32:39 +00:00
|
|
|
NTAPI
|
2010-12-23 08:42:51 +00:00
|
|
|
CcpUnpinData(PNOCC_BCB Bcb, BOOLEAN ActuallyRelease);
|
[CACHE]
The cache manager rewrite I started years ago has finally appeared in
ReactOS' trunk and although at this point it's not quite perfectly
integrated, it's enough to boot up the bootcd or livecd. To check out
the more mature original, check out arty-newcc-reactos, branch
arty-newcc on bitbucket.org . Amine Khaldi encouraged me quite a bit
to not give up on it, and was able to reach out and be an advocate
when i really wasn't able to. Others agree that the time has come to
begin removing the old cache manager. I expect the remaining problems
in the version going to trunk will be taken care of relatively
quickly.
The motivation for this effort lies in the particularly hairy
relationship between ReactOS' cache manager and data sections. This
code completely removes page sharing between cache manager and section
and reimagines cache manager as being a facility layered on the memory
manager, not really caring about individual pages, but simply managing
data section objects where caching might occur.
It took me about 2 years to do the first pass of this rewrite and most
of this year to fix some lingering issues, properly implement demand
paging in ReactOS (code which didn't come with this patch in a
recognizable form), and finish getting the PrivateCacheMap and
SharedCacheMap relationship correct.
Currently, the new ntoskrnl/cache directory contains an own
implementation of data file sections. After things have settled down,
we can begin to deprecate and remove the parts of ReactOS' section
implementation that depend on a close relationship with cache
manager. Eventually, I think that the extra code added to
ntoskrnl/cache/section will be removed and ReactOS' own sections will
replace the use of the special MM_CACHE_SECTION_SEGMENT in the cache
path.
Note also, that this makes all cache manager (and new section parts)
use wide file offsets. If my section code were to take over other
parts of the ReactOS memory manager, they would also benefit from
these improvements.
I invite anyone who wants to to peek at this code and fix whatever
bugs can be found.
svn path=/trunk/; revision=49423
2010-11-02 02:32:39 +00:00
|
|
|
|
|
|
|
BOOLEAN
|
|
|
|
NTAPI
|
|
|
|
CcInitializeCacheManager(VOID);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
NTAPI
|
|
|
|
CcShutdownSystem();
|
|
|
|
|
|
|
|
VOID
|
|
|
|
NTAPI
|
|
|
|
CcInitCacheZeroPage(VOID);
|
|
|
|
|
|
|
|
/* Called by section.c */
|
|
|
|
BOOLEAN
|
|
|
|
NTAPI
|
|
|
|
CcFlushImageSection(PSECTION_OBJECT_POINTERS SectionObjectPointer, MMFLUSH_TYPE FlushType);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
NTAPI
|
|
|
|
_CcpFlushCache
|
|
|
|
(IN PNOCC_CACHE_MAP Map,
|
|
|
|
IN OPTIONAL PLARGE_INTEGER FileOffset,
|
|
|
|
IN ULONG Length,
|
|
|
|
OUT OPTIONAL PIO_STATUS_BLOCK IoStatus,
|
|
|
|
BOOLEAN Delete,
|
|
|
|
const char *File,
|
|
|
|
int Line);
|
|
|
|
|
|
|
|
#define CcpFlushCache(M,F,L,I,D) _CcpFlushCache(M,F,L,I,D,__FILE__,__LINE__)
|
|
|
|
|
|
|
|
BOOLEAN
|
|
|
|
NTAPI
|
|
|
|
CcGetFileSizes(PFILE_OBJECT FileObject, PCC_FILE_SIZES FileSizes);
|
|
|
|
|
|
|
|
ULONG
|
|
|
|
NTAPI
|
|
|
|
CcpCountCacheSections(PNOCC_CACHE_MAP Map);
|
|
|
|
|
|
|
|
BOOLEAN
|
|
|
|
NTAPI
|
|
|
|
CcpAcquireFileLock(PNOCC_CACHE_MAP Map);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
NTAPI
|
|
|
|
CcpReleaseFileLock(PNOCC_CACHE_MAP Map);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Macro for generic cache manage bugchecking. Note that this macro assumes
|
|
|
|
* that the file name including extension is always longer than 4 characters.
|
|
|
|
*/
|
|
|
|
#define KEBUGCHECKCC \
|
|
|
|
KEBUGCHECKEX(CACHE_MANAGER, \
|
|
|
|
(*(ULONG*)(__FILE__ + sizeof(__FILE__) - 4) << 16) | \
|
|
|
|
(__LINE__ & 0xFFFF), 0, 0, 0)
|
|
|
|
|
|
|
|
/* Private data */
|
|
|
|
|
|
|
|
#define CACHE_SINGLE_FILE_MAX (16)
|
|
|
|
#define CACHE_OVERALL_SIZE (32 * 1024 * 1024)
|
|
|
|
#define CACHE_STRIPE VACB_MAPPING_GRANULARITY
|
|
|
|
#define CACHE_SHIFT 18
|
|
|
|
#define CACHE_NUM_SECTIONS (CACHE_OVERALL_SIZE / CACHE_STRIPE)
|
|
|
|
#define CACHE_ROUND_UP(x) (((x) + (CACHE_STRIPE-1)) & ~(CACHE_STRIPE-1))
|
|
|
|
#define CACHE_ROUND_DOWN(x) ((x) & ~(CACHE_STRIPE-1))
|
|
|
|
#define INVALID_CACHE ((ULONG)~0)
|
|
|
|
|
|
|
|
extern NOCC_BCB CcCacheSections[CACHE_NUM_SECTIONS];
|
|
|
|
extern PRTL_BITMAP CcCacheBitmap;
|
|
|
|
extern FAST_MUTEX CcMutex;
|
|
|
|
extern KEVENT CcDeleteEvent;
|
|
|
|
extern ULONG CcCacheClockHand;
|
|
|
|
extern LIST_ENTRY CcPendingUnmap;
|
|
|
|
extern KEVENT CcpLazyWriteEvent;
|
|
|
|
|
|
|
|
#define CcpLock() _CcpLock(__FILE__,__LINE__)
|
|
|
|
#define CcpUnlock() _CcpUnlock(__FILE__,__LINE__)
|
|
|
|
|
|
|
|
extern VOID _CcpLock(const char *file, int line);
|
|
|
|
extern VOID _CcpUnlock(const char *file, int line);
|
|
|
|
|
|
|
|
extern VOID CcpReferenceCache(ULONG Sector);
|
|
|
|
extern VOID CcpDereferenceCache(ULONG Sector, BOOLEAN Immediate);
|
|
|
|
BOOLEAN
|
|
|
|
NTAPI
|
|
|
|
CcpMapData
|
|
|
|
(IN PFILE_OBJECT FileObject,
|
|
|
|
IN PLARGE_INTEGER FileOffset,
|
|
|
|
IN ULONG Length,
|
|
|
|
IN ULONG Flags,
|
|
|
|
OUT PVOID *BcbResult,
|
|
|
|
OUT PVOID *Buffer);
|
|
|
|
|
|
|
|
BOOLEAN
|
|
|
|
NTAPI
|
|
|
|
CcpPinMappedData(IN PNOCC_CACHE_MAP Map,
|
|
|
|
IN PLARGE_INTEGER FileOffset,
|
|
|
|
IN ULONG Length,
|
|
|
|
IN ULONG Flags,
|
|
|
|
IN OUT PVOID *Bcb);
|