123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634 |
- /*++
- Copyright (c) 2016 Minoca Corp. All Rights Reserved
- Module Name:
- pagecach.h
- Abstract:
- This header contains definitions for integrating the page cache throughout
- the rest of I/O.
- Author:
- Evan Green 29-Jan-2016
- --*/
- //
- // ------------------------------------------------------------------- Includes
- //
- //
- // ---------------------------------------------------------------- Definitions
- //
- //
- // This flag is set to indicate that the page cache eviction operation is
- // executing as a result of a truncate.
- //
- #define PAGE_CACHE_EVICTION_FLAG_TRUNCATE 0x00000001
- //
- // This flag is set to indicate that the page cache eviction operation is
- // executing as a result of a delete. There should be no outstanding references
- // on the device or file.
- //
- #define PAGE_CACHE_EVICTION_FLAG_DELETE 0x00000002
- //
- // This flag is set to indicate that the page cache eviction operation is
- // executing as a result of a remove. There may be outstanding references on
- // the device or file, but all of its cache entries should be aggressively
- // removed.
- //
- #define PAGE_CACHE_EVICTION_FLAG_REMOVE 0x00000004
- //
- // Define the number of pages to clean if a random write stumbles into a page
- // cache that is too dirty.
- //
- #define PAGE_CACHE_DIRTY_PENANCE_PAGES 128
- //
- // ------------------------------------------------------ Data Type Definitions
- //
- //
- // -------------------------------------------------------------------- Globals
- //
- //
- // Store the global list of dirty file objects.
- //
- extern LIST_ENTRY IoFileObjectsDirtyList;
- //
- // -------------------------------------------------------- Function Prototypes
- //
- KSTATUS
- IopInitializePageCache (
- VOID
- );
- /*++
- Routine Description:
- This routine initializes the page cache.
- Arguments:
- None.
- Return Value:
- Status code.
- --*/
- PPAGE_CACHE_ENTRY
- IopLookupPageCacheEntry (
- PFILE_OBJECT FileObject,
- IO_OFFSET Offset
- );
- /*++
- Routine Description:
- This routine searches for a page cache entry based on the file object and
- offset. If found, this routine takes a reference on the page cache entry.
- Arguments:
- FileObject - Supplies a pointer to a file object for the device or file.
- Offset - Supplies an offset into the file or device.
- Return Value:
- Returns a pointer to the found page cache entry on success, or NULL on
- failure.
- --*/
- PPAGE_CACHE_ENTRY
- IopCreateOrLookupPageCacheEntry (
- PFILE_OBJECT FileObject,
- PVOID VirtualAddress,
- PHYSICAL_ADDRESS PhysicalAddress,
- IO_OFFSET Offset,
- PPAGE_CACHE_ENTRY LinkEntry,
- PBOOL EntryCreated
- );
- /*++
- Routine Description:
- This routine creates a page cache entry and inserts it into the cache. Or,
- if a page cache entry already exists for the supplied file object and
- offset, it returns the existing entry. The file object lock must be held
- exclusive already.
- Arguments:
- FileObject - Supplies a pointer to a file object for the device or file
- that owns the contents of the physical page.
- VirtualAddress - Supplies an optional virtual address of the page.
- PhysicalAddress - Supplies the physical address of the page.
- Offset - Supplies the offset into the file or device where the page is
- from.
- LinkEntry - Supplies an optional pointer to a page cache entry that is
- to share the physical address with this new page cache entry if it gets
- inserted.
- EntryCreated - Supplies an optional pointer that receives a boolean
- indicating whether or not a new page cache entry was created.
- Return Value:
- Returns a pointer to a page cache entry on success, or NULL on failure.
- --*/
- PPAGE_CACHE_ENTRY
- IopCreateAndInsertPageCacheEntry (
- PFILE_OBJECT FileObject,
- PVOID VirtualAddress,
- PHYSICAL_ADDRESS PhysicalAddress,
- IO_OFFSET Offset,
- PPAGE_CACHE_ENTRY LinkEntry
- );
- /*++
- Routine Description:
- This routine creates a page cache entry and inserts it into the cache. The
- caller should be certain that there is not another entry in the cache for
- the same file object and offset and that nothing else is in contention to
- create the same entry.
- Arguments:
- FileObject - Supplies a pointer to a file object for the device or file
- that owns the contents of the physical page.
- VirtualAddress - Supplies an optional virtual address of the page.
- PhysicalAddress - Supplies the physical address of the page.
- Offset - Supplies the offset into the file or device where the page is
- from.
- LinkEntry - Supplies an optional pointer to a page cache entry that is to
- share the physical address with the new page cache entry.
- Return Value:
- Returns a pointer to a page cache entry on success, or NULL on failure.
- --*/
- KSTATUS
- IopCopyAndCacheIoBuffer (
- PFILE_OBJECT FileObject,
- IO_OFFSET FileOffset,
- PIO_BUFFER Destination,
- UINTN CopySize,
- PIO_BUFFER Source,
- UINTN SourceSize,
- UINTN SourceCopyOffset,
- PUINTN BytesCopied
- );
- /*++
- Routine Description:
- This routine iterates over the source buffer, caching each page and copying
- the pages to the destination buffer starting at the given copy offsets and
- up to the given copy size. The file object lock must be held exclusive
- already.
- Arguments:
- FileObject - Supplies a pointer to the file object for the device or file
- that owns the data.
- FileOffset - Supplies an offset into the file that corresponds to the
- beginning of the source I/O buffer.
- Destination - Supplies a pointer to the destination I/O buffer.
- CopySize - Supplies the maximum number of bytes that can be copied
- to the destination.
- Source - Supplies a pointer to the source I/O buffer.
- SourceSize - Supplies the number of bytes in the source that should be
- cached.
- SourceCopyOffset - Supplies the offset into the source buffer where the
- copy to the destination should start.
- BytesCopied - Supplies a pointer that receives the number of bytes copied
- to the destination buffer.
- Return Value:
- Status code.
- --*/
- KSTATUS
- IopFlushPageCacheEntries (
- PFILE_OBJECT FileObject,
- IO_OFFSET Offset,
- ULONGLONG Size,
- ULONG Flags,
- PUINTN PageCount
- );
- /*++
- Routine Description:
- This routine flushes the page cache entries for the given file object
- starting at the given offset for the requested size. This routine does not
- return until all file data has successfully been written to disk. It does
- not guarantee that file meta-data has been flushed to disk.
- Arguments:
- FileObject - Supplies a pointer to a file object for the device or file.
- Offset - Supplies the offset from the beginning of the file or device where
- the flush should be done.
- Size - Supplies the size, in bytes, of the region to flush. Supply a value
- of -1 to flush from the given offset to the end of the file.
- Flags - Supplies a bitmask of I/O flags. See IO_FLAG_* for definitions.
- PageCount - Supplies an optional pointer describing how many pages to flush.
- On output this value will be decreased by the number of pages actually
- flushed. Supply NULL to flush all pages in the size range.
- Return Value:
- Status code.
- --*/
- VOID
- IopEvictPageCacheEntries (
- PFILE_OBJECT FileObject,
- IO_OFFSET Offset,
- ULONG Flags
- );
- /*++
- Routine Description:
- This routine attempts to evict the page cache entries for a given file or
- device, as specified by the file object. The flags specify how aggressive
- this routine should be. The file object lock must already be held exclusive.
- Arguments:
- FileObject - Supplies a pointer to a file object for the device or file.
- Offset - Supplies the starting offset into the file or device after which
- all page cache entries should be evicted.
- Flags - Supplies a bitmask of eviction flags. See
- PAGE_CACHE_EVICTION_FLAG_* for definitions.
- Return Value:
- None.
- --*/
- BOOL
- IopIsIoBufferPageCacheBacked (
- PFILE_OBJECT FileObject,
- PIO_BUFFER IoBuffer,
- IO_OFFSET Offset,
- UINTN SizeInBytes
- );
- /*++
- Routine Description:
- This routine determines whether or not the given I/O buffer with data
- targeting the given file object at the given offset is currently backed by
- the page cache. The caller is expected to synchronize with eviction via
- truncate.
- Arguments:
- FileObject - Supplies a pointer to a file object.
- IoBuffer - Supplies a pointer to an I/O buffer.
- Offset - Supplies an offset into the file or device object.
- SizeInBytes - Supplied the number of bytes in the I/O buffer that should be
- cache backed.
- Return Value:
- Returns TRUE if the I/O buffer is backed by valid page cache entries, or
- FALSE otherwise.
- --*/
- VOID
- IopSchedulePageCacheThread (
- VOID
- );
- /*++
- Routine Description:
- This routine schedules a cleaning of the page cache for some time in the
- future.
- Arguments:
- None.
- Return Value:
- None.
- --*/
- IO_OFFSET
- IopGetPageCacheEntryOffset (
- PPAGE_CACHE_ENTRY PageCacheEntry
- );
- /*++
- Routine Description:
- This routine gets the file or device offset of the given page cache entry.
- Arguments:
- PageCacheEntry - Supplies a pointer to a page cache entry.
- Return Value:
- Returns the file or device offset of the given page cache entry.
- --*/
- BOOL
- IopMarkPageCacheEntryClean (
- PPAGE_CACHE_ENTRY PageCacheEntry,
- BOOL MoveToCleanList
- );
- /*++
- Routine Description:
- This routine marks the given page cache entry as clean.
- Arguments:
- PageCacheEntry - Supplies a pointer to a page cache entry.
- MoveToCleanList - Supplies a boolean indicating if the page cache entry
- should be moved to the list of clean page cache entries.
- Return Value:
- Returns TRUE if it marked the entry clean or FALSE if the entry was already
- clean.
- --*/
- BOOL
- IopMarkPageCacheEntryDirty (
- PPAGE_CACHE_ENTRY PageCacheEntry
- );
- /*++
- Routine Description:
- This routine marks the given page cache entry as dirty. The file object
- lock must already be held.
- Arguments:
- PageCacheEntry - Supplies a pointer to a page cache entry.
- Return Value:
- Returns TRUE if it marked the entry dirty or FALSE if the entry was already
- dirty.
- --*/
- KSTATUS
- IopCopyIoBufferToPageCacheEntry (
- PPAGE_CACHE_ENTRY PageCacheEntry,
- ULONG PageOffset,
- PIO_BUFFER SourceBuffer,
- UINTN SourceOffset,
- ULONG ByteCount
- );
- /*++
- Routine Description:
- This routine copies up to a page from the given source buffer to the given
- page cache entry.
- Arguments:
- PageCacheEntry - Supplies a pointer to a page cache entry.
- PageOffset - Supplies an offset into the page where the copy should begin.
- SourceBuffer - Supplies a pointer to the source buffer where the data
- originates.
- SourceOffset - Supplies an offset into the the source buffer where the data
- copy should begin.
- ByteCount - Supplies the number of bytes to copy.
- Return Value:
- Status code.
- --*/
- BOOL
- IopCanLinkPageCacheEntry (
- PPAGE_CACHE_ENTRY PageCacheEntry,
- PFILE_OBJECT FileObject
- );
- /*++
- Routine Description:
- This routine determines if the given page cache entry could link with a
- page cache entry for the given file object.
- Arguments:
- PageCacheEntry - Supplies a pointer to a page cache entry.
- FileObject - Supplied a pointer to a file object.
- Return Value:
- Returns TRUE if the page cache entry could be linked to a page cache entry
- with the given file object or FALSE otherwise.
- --*/
- BOOL
- IopLinkPageCacheEntries (
- PPAGE_CACHE_ENTRY LowerEntry,
- PPAGE_CACHE_ENTRY UpperEntry
- );
- /*++
- Routine Description:
- This routine attempts to link the given link entry to the page cache entry
- so that they can begin sharing a physical page that is currently used by
- the link entry.
- Arguments:
- LowerEntry - Supplies a pointer to the lower (disk) level page cache entry
- whose physical address is to be modified. The caller should ensure that
- its reference on this entry does not come from an I/O buffer or else
- the physical address in the I/O buffer would be invalid. The file
- object lock for this entry must already be held exclusive.
- UpperEntry - Supplies a pointer to the upper (file) page cache entry
- that currently owns the physical page to be shared.
- Return Value:
- Returns TRUE if the two page cache entries are already connected or if the
- routine is successful. It returns FALSE otherwise and both page cache
- entries should continue to use their own physical pages.
- --*/
- VOID
- IopTrimPageCache (
- BOOL TimidEffort
- );
- /*++
- Routine Description:
- This routine removes as many clean page cache entries as is necessary to
- bring the size of the page cache back down to a reasonable level. It evicts
- the page cache entries in LRU order.
- Arguments:
- TimidEffort - Supplies a boolean indicating whether or not this function
- should only try once to acquire a file object lock before moving on.
- Set this to TRUE if this thread might already be holding file object
- locks.
- Return Value:
- None.
- --*/
- BOOL
- IopIsPageCacheTooDirty (
- VOID
- );
- /*++
- Routine Description:
- This routine determines if the page cache has an uncomfortable number of
- entries in it that are dirty. Dirty entries are dangerous because they
- prevent the page cache from shrinking if memory gets tight.
- Arguments:
- None.
- Return Value:
- TRUE if the page cache has too many dirty entries and adding new ones
- should generally be avoided.
- FALSE if the page cache is relatively clean.
- --*/
- COMPARISON_RESULT
- IopComparePageCacheEntries (
- PRED_BLACK_TREE Tree,
- PRED_BLACK_TREE_NODE FirstNode,
- PRED_BLACK_TREE_NODE SecondNode
- );
- /*++
- Routine Description:
- This routine compares two Red-Black tree nodes contained inside file
- objects.
- Arguments:
- Tree - Supplies a pointer to the Red-Black tree that owns both nodes.
- FirstNode - Supplies a pointer to the left side of the comparison.
- SecondNode - Supplies a pointer to the second side of the comparison.
- Return Value:
- Same if the two nodes have the same value.
- Ascending if the first node is less than the second node.
- Descending if the second node is less than the first node.
- --*/
|