mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
FS-Cache: Recruit a page flags for cache management
Recruit a page flag to aid in cache management. The following extra flag is defined: (1) PG_fscache (PG_private_2) The marked page is backed by a local cache and is pinning resources in the cache driver. If PG_fscache is set, then things that checked for PG_private will now also check for that. This includes things like truncation and page invalidation. The function page_has_private() had been added to make the checks for both PG_private and PG_private_2 at the same time. Signed-off-by: David Howells <dhowells@redhat.com> Acked-by: Steve Dickson <steved@redhat.com> Acked-by: Trond Myklebust <Trond.Myklebust@netapp.com> Acked-by: Rik van Riel <riel@redhat.com> Acked-by: Al Viro <viro@zeniv.linux.org.uk> Tested-by: Daire Byrne <Daire.Byrne@framestore.com>
This commit is contained in:
parent
03fb3d2af9
commit
266cf658ef
8 changed files with 58 additions and 25 deletions
|
@ -82,6 +82,7 @@ enum pageflags {
|
|||
PG_arch_1,
|
||||
PG_reserved,
|
||||
PG_private, /* If pagecache, has fs-private data */
|
||||
PG_private_2, /* If pagecache, has fs aux data */
|
||||
PG_writeback, /* Page is under writeback */
|
||||
#ifdef CONFIG_PAGEFLAGS_EXTENDED
|
||||
PG_head, /* A head page */
|
||||
|
@ -108,6 +109,12 @@ enum pageflags {
|
|||
/* Filesystems */
|
||||
PG_checked = PG_owner_priv_1,
|
||||
|
||||
/* Two page bits are conscripted by FS-Cache to maintain local caching
|
||||
* state. These bits are set on pages belonging to the netfs's inodes
|
||||
* when those inodes are being locally cached.
|
||||
*/
|
||||
PG_fscache = PG_private_2, /* page backed by cache */
|
||||
|
||||
/* XEN */
|
||||
PG_pinned = PG_owner_priv_1,
|
||||
PG_savepinned = PG_dirty,
|
||||
|
@ -194,8 +201,6 @@ PAGEFLAG(Checked, checked) /* Used by some filesystems */
|
|||
PAGEFLAG(Pinned, pinned) TESTSCFLAG(Pinned, pinned) /* Xen */
|
||||
PAGEFLAG(SavePinned, savepinned); /* Xen */
|
||||
PAGEFLAG(Reserved, reserved) __CLEARPAGEFLAG(Reserved, reserved)
|
||||
PAGEFLAG(Private, private) __CLEARPAGEFLAG(Private, private)
|
||||
__SETPAGEFLAG(Private, private)
|
||||
PAGEFLAG(SwapBacked, swapbacked) __CLEARPAGEFLAG(SwapBacked, swapbacked)
|
||||
|
||||
__PAGEFLAG(SlobPage, slob_page)
|
||||
|
@ -204,6 +209,16 @@ __PAGEFLAG(SlobFree, slob_free)
|
|||
__PAGEFLAG(SlubFrozen, slub_frozen)
|
||||
__PAGEFLAG(SlubDebug, slub_debug)
|
||||
|
||||
/*
|
||||
* Private page markings that may be used by the filesystem that owns the page
|
||||
* for its own purposes.
|
||||
* - PG_private and PG_private_2 cause releasepage() and co to be invoked
|
||||
*/
|
||||
PAGEFLAG(Private, private) __SETPAGEFLAG(Private, private)
|
||||
__CLEARPAGEFLAG(Private, private)
|
||||
PAGEFLAG(Private2, private_2) TESTSCFLAG(Private2, private_2)
|
||||
PAGEFLAG(OwnerPriv1, owner_priv_1) TESTCLEARFLAG(OwnerPriv1, owner_priv_1)
|
||||
|
||||
/*
|
||||
* Only test-and-set exist for PG_writeback. The unconditional operators are
|
||||
* risky: they bypass page accounting.
|
||||
|
@ -384,9 +399,10 @@ static inline void __ClearPageTail(struct page *page)
|
|||
* these flags set. It they are, there is a problem.
|
||||
*/
|
||||
#define PAGE_FLAGS_CHECK_AT_FREE \
|
||||
(1 << PG_lru | 1 << PG_private | 1 << PG_locked | \
|
||||
1 << PG_buddy | 1 << PG_writeback | 1 << PG_reserved | \
|
||||
1 << PG_slab | 1 << PG_swapcache | 1 << PG_active | \
|
||||
(1 << PG_lru | 1 << PG_locked | \
|
||||
1 << PG_private | 1 << PG_private_2 | \
|
||||
1 << PG_buddy | 1 << PG_writeback | 1 << PG_reserved | \
|
||||
1 << PG_slab | 1 << PG_swapcache | 1 << PG_active | \
|
||||
__PG_UNEVICTABLE | __PG_MLOCKED)
|
||||
|
||||
/*
|
||||
|
@ -397,4 +413,16 @@ static inline void __ClearPageTail(struct page *page)
|
|||
#define PAGE_FLAGS_CHECK_AT_PREP ((1 << NR_PAGEFLAGS) - 1)
|
||||
|
||||
#endif /* !__GENERATING_BOUNDS_H */
|
||||
|
||||
/**
|
||||
* page_has_private - Determine if page has private stuff
|
||||
* @page: The page to be checked
|
||||
*
|
||||
* Determine if a page has private stuff, indicating that release routines
|
||||
* should be invoked upon it.
|
||||
*/
|
||||
#define page_has_private(page) \
|
||||
((page)->flags & ((1 << PG_private) | \
|
||||
(1 << PG_private_2)))
|
||||
|
||||
#endif /* PAGE_FLAGS_H */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue