diff options
| author | David Howells <dhowells@redhat.com> | 2009-04-03 11:42:36 -0400 |
|---|---|---|
| committer | David Howells <dhowells@redhat.com> | 2009-04-03 11:42:36 -0400 |
| commit | 266cf658efcf6ac33541a46740f74f50c79d2b6b (patch) | |
| tree | 5c83b0879892d509e598dfd54be3ba3679ecd348 /include | |
| parent | 03fb3d2af96c2783c3a5bc03f3d984cf422f0e69 (diff) | |
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>
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/page-flags.h | 38 |
1 files changed, 33 insertions, 5 deletions
diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index 9d99e7471ade..62214c7d2d93 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h | |||
| @@ -82,6 +82,7 @@ enum pageflags { | |||
| 82 | PG_arch_1, | 82 | PG_arch_1, |
| 83 | PG_reserved, | 83 | PG_reserved, |
| 84 | PG_private, /* If pagecache, has fs-private data */ | 84 | PG_private, /* If pagecache, has fs-private data */ |
| 85 | PG_private_2, /* If pagecache, has fs aux data */ | ||
| 85 | PG_writeback, /* Page is under writeback */ | 86 | PG_writeback, /* Page is under writeback */ |
| 86 | #ifdef CONFIG_PAGEFLAGS_EXTENDED | 87 | #ifdef CONFIG_PAGEFLAGS_EXTENDED |
| 87 | PG_head, /* A head page */ | 88 | PG_head, /* A head page */ |
| @@ -108,6 +109,12 @@ enum pageflags { | |||
| 108 | /* Filesystems */ | 109 | /* Filesystems */ |
| 109 | PG_checked = PG_owner_priv_1, | 110 | PG_checked = PG_owner_priv_1, |
| 110 | 111 | ||
| 112 | /* Two page bits are conscripted by FS-Cache to maintain local caching | ||
| 113 | * state. These bits are set on pages belonging to the netfs's inodes | ||
| 114 | * when those inodes are being locally cached. | ||
| 115 | */ | ||
| 116 | PG_fscache = PG_private_2, /* page backed by cache */ | ||
| 117 | |||
| 111 | /* XEN */ | 118 | /* XEN */ |
| 112 | PG_pinned = PG_owner_priv_1, | 119 | PG_pinned = PG_owner_priv_1, |
| 113 | PG_savepinned = PG_dirty, | 120 | PG_savepinned = PG_dirty, |
| @@ -194,8 +201,6 @@ PAGEFLAG(Checked, checked) /* Used by some filesystems */ | |||
| 194 | PAGEFLAG(Pinned, pinned) TESTSCFLAG(Pinned, pinned) /* Xen */ | 201 | PAGEFLAG(Pinned, pinned) TESTSCFLAG(Pinned, pinned) /* Xen */ |
| 195 | PAGEFLAG(SavePinned, savepinned); /* Xen */ | 202 | PAGEFLAG(SavePinned, savepinned); /* Xen */ |
| 196 | PAGEFLAG(Reserved, reserved) __CLEARPAGEFLAG(Reserved, reserved) | 203 | PAGEFLAG(Reserved, reserved) __CLEARPAGEFLAG(Reserved, reserved) |
| 197 | PAGEFLAG(Private, private) __CLEARPAGEFLAG(Private, private) | ||
| 198 | __SETPAGEFLAG(Private, private) | ||
| 199 | PAGEFLAG(SwapBacked, swapbacked) __CLEARPAGEFLAG(SwapBacked, swapbacked) | 204 | PAGEFLAG(SwapBacked, swapbacked) __CLEARPAGEFLAG(SwapBacked, swapbacked) |
| 200 | 205 | ||
| 201 | __PAGEFLAG(SlobPage, slob_page) | 206 | __PAGEFLAG(SlobPage, slob_page) |
| @@ -205,6 +210,16 @@ __PAGEFLAG(SlubFrozen, slub_frozen) | |||
| 205 | __PAGEFLAG(SlubDebug, slub_debug) | 210 | __PAGEFLAG(SlubDebug, slub_debug) |
| 206 | 211 | ||
| 207 | /* | 212 | /* |
| 213 | * Private page markings that may be used by the filesystem that owns the page | ||
| 214 | * for its own purposes. | ||
| 215 | * - PG_private and PG_private_2 cause releasepage() and co to be invoked | ||
| 216 | */ | ||
| 217 | PAGEFLAG(Private, private) __SETPAGEFLAG(Private, private) | ||
| 218 | __CLEARPAGEFLAG(Private, private) | ||
| 219 | PAGEFLAG(Private2, private_2) TESTSCFLAG(Private2, private_2) | ||
| 220 | PAGEFLAG(OwnerPriv1, owner_priv_1) TESTCLEARFLAG(OwnerPriv1, owner_priv_1) | ||
| 221 | |||
| 222 | /* | ||
| 208 | * Only test-and-set exist for PG_writeback. The unconditional operators are | 223 | * Only test-and-set exist for PG_writeback. The unconditional operators are |
| 209 | * risky: they bypass page accounting. | 224 | * risky: they bypass page accounting. |
| 210 | */ | 225 | */ |
| @@ -384,9 +399,10 @@ static inline void __ClearPageTail(struct page *page) | |||
| 384 | * these flags set. It they are, there is a problem. | 399 | * these flags set. It they are, there is a problem. |
| 385 | */ | 400 | */ |
| 386 | #define PAGE_FLAGS_CHECK_AT_FREE \ | 401 | #define PAGE_FLAGS_CHECK_AT_FREE \ |
| 387 | (1 << PG_lru | 1 << PG_private | 1 << PG_locked | \ | 402 | (1 << PG_lru | 1 << PG_locked | \ |
| 388 | 1 << PG_buddy | 1 << PG_writeback | 1 << PG_reserved | \ | 403 | 1 << PG_private | 1 << PG_private_2 | \ |
| 389 | 1 << PG_slab | 1 << PG_swapcache | 1 << PG_active | \ | 404 | 1 << PG_buddy | 1 << PG_writeback | 1 << PG_reserved | \ |
| 405 | 1 << PG_slab | 1 << PG_swapcache | 1 << PG_active | \ | ||
| 390 | __PG_UNEVICTABLE | __PG_MLOCKED) | 406 | __PG_UNEVICTABLE | __PG_MLOCKED) |
| 391 | 407 | ||
| 392 | /* | 408 | /* |
| @@ -397,4 +413,16 @@ static inline void __ClearPageTail(struct page *page) | |||
| 397 | #define PAGE_FLAGS_CHECK_AT_PREP ((1 << NR_PAGEFLAGS) - 1) | 413 | #define PAGE_FLAGS_CHECK_AT_PREP ((1 << NR_PAGEFLAGS) - 1) |
| 398 | 414 | ||
| 399 | #endif /* !__GENERATING_BOUNDS_H */ | 415 | #endif /* !__GENERATING_BOUNDS_H */ |
| 416 | |||
| 417 | /** | ||
| 418 | * page_has_private - Determine if page has private stuff | ||
| 419 | * @page: The page to be checked | ||
| 420 | * | ||
| 421 | * Determine if a page has private stuff, indicating that release routines | ||
| 422 | * should be invoked upon it. | ||
| 423 | */ | ||
| 424 | #define page_has_private(page) \ | ||
| 425 | ((page)->flags & ((1 << PG_private) | \ | ||
| 426 | (1 << PG_private_2))) | ||
| 427 | |||
| 400 | #endif /* PAGE_FLAGS_H */ | 428 | #endif /* PAGE_FLAGS_H */ |
