diff options
| author | Nicholas Bellinger <nab@linux-iscsi.org> | 2011-01-16 16:21:04 -0500 |
|---|---|---|
| committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2011-01-16 16:21:04 -0500 |
| commit | f652f6c5b7cfdf139f4155d78f397e99ae1c4acc (patch) | |
| tree | 71c6344688bf56ea6aaf18c586ab69ff4f077ade /include/linux/page-flags.h | |
| parent | 140e3008e7fe1526cbb12f8f07dbc273ac713b75 (diff) | |
| parent | c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5 (diff) | |
Merge branch 'master' of /pub/scm/linux/kernel/git/jejb/scsi-post-merge-2.6 into for-linus
Diffstat (limited to 'include/linux/page-flags.h')
| -rw-r--r-- | include/linux/page-flags.h | 71 |
1 files changed, 62 insertions, 9 deletions
diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index 5f38c460367e..0db8037e2725 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h | |||
| @@ -48,9 +48,6 @@ | |||
| 48 | * struct page (these bits with information) are always mapped into kernel | 48 | * struct page (these bits with information) are always mapped into kernel |
| 49 | * address space... | 49 | * address space... |
| 50 | * | 50 | * |
| 51 | * PG_buddy is set to indicate that the page is free and in the buddy system | ||
| 52 | * (see mm/page_alloc.c). | ||
| 53 | * | ||
| 54 | * PG_hwpoison indicates that a page got corrupted in hardware and contains | 51 | * PG_hwpoison indicates that a page got corrupted in hardware and contains |
| 55 | * data with incorrect ECC bits that triggered a machine check. Accessing is | 52 | * data with incorrect ECC bits that triggered a machine check. Accessing is |
| 56 | * not safe since it may cause another machine check. Don't touch! | 53 | * not safe since it may cause another machine check. Don't touch! |
| @@ -96,7 +93,6 @@ enum pageflags { | |||
| 96 | PG_swapcache, /* Swap page: swp_entry_t in private */ | 93 | PG_swapcache, /* Swap page: swp_entry_t in private */ |
| 97 | PG_mappedtodisk, /* Has blocks allocated on-disk */ | 94 | PG_mappedtodisk, /* Has blocks allocated on-disk */ |
| 98 | PG_reclaim, /* To be reclaimed asap */ | 95 | PG_reclaim, /* To be reclaimed asap */ |
| 99 | PG_buddy, /* Page is free, on buddy lists */ | ||
| 100 | PG_swapbacked, /* Page is backed by RAM/swap */ | 96 | PG_swapbacked, /* Page is backed by RAM/swap */ |
| 101 | PG_unevictable, /* Page is "unevictable" */ | 97 | PG_unevictable, /* Page is "unevictable" */ |
| 102 | #ifdef CONFIG_MMU | 98 | #ifdef CONFIG_MMU |
| @@ -108,6 +104,9 @@ enum pageflags { | |||
| 108 | #ifdef CONFIG_MEMORY_FAILURE | 104 | #ifdef CONFIG_MEMORY_FAILURE |
| 109 | PG_hwpoison, /* hardware poisoned page. Don't touch */ | 105 | PG_hwpoison, /* hardware poisoned page. Don't touch */ |
| 110 | #endif | 106 | #endif |
| 107 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | ||
| 108 | PG_compound_lock, | ||
| 109 | #endif | ||
| 111 | __NR_PAGEFLAGS, | 110 | __NR_PAGEFLAGS, |
| 112 | 111 | ||
| 113 | /* Filesystems */ | 112 | /* Filesystems */ |
| @@ -198,7 +197,7 @@ static inline int __TestClearPage##uname(struct page *page) { return 0; } | |||
| 198 | struct page; /* forward declaration */ | 197 | struct page; /* forward declaration */ |
| 199 | 198 | ||
| 200 | TESTPAGEFLAG(Locked, locked) TESTSETFLAG(Locked, locked) | 199 | TESTPAGEFLAG(Locked, locked) TESTSETFLAG(Locked, locked) |
| 201 | PAGEFLAG(Error, error) | 200 | PAGEFLAG(Error, error) TESTCLEARFLAG(Error, error) |
| 202 | PAGEFLAG(Referenced, referenced) TESTCLEARFLAG(Referenced, referenced) | 201 | PAGEFLAG(Referenced, referenced) TESTCLEARFLAG(Referenced, referenced) |
| 203 | PAGEFLAG(Dirty, dirty) TESTSCFLAG(Dirty, dirty) __CLEARPAGEFLAG(Dirty, dirty) | 202 | PAGEFLAG(Dirty, dirty) TESTSCFLAG(Dirty, dirty) __CLEARPAGEFLAG(Dirty, dirty) |
| 204 | PAGEFLAG(LRU, lru) __CLEARPAGEFLAG(LRU, lru) | 203 | PAGEFLAG(LRU, lru) __CLEARPAGEFLAG(LRU, lru) |
| @@ -230,7 +229,6 @@ PAGEFLAG(OwnerPriv1, owner_priv_1) TESTCLEARFLAG(OwnerPriv1, owner_priv_1) | |||
| 230 | * risky: they bypass page accounting. | 229 | * risky: they bypass page accounting. |
| 231 | */ | 230 | */ |
| 232 | TESTPAGEFLAG(Writeback, writeback) TESTSCFLAG(Writeback, writeback) | 231 | TESTPAGEFLAG(Writeback, writeback) TESTSCFLAG(Writeback, writeback) |
| 233 | __PAGEFLAG(Buddy, buddy) | ||
| 234 | PAGEFLAG(MappedToDisk, mappedtodisk) | 232 | PAGEFLAG(MappedToDisk, mappedtodisk) |
| 235 | 233 | ||
| 236 | /* PG_readahead is only used for file reads; PG_reclaim is only for writes */ | 234 | /* PG_readahead is only used for file reads; PG_reclaim is only for writes */ |
| @@ -344,7 +342,7 @@ static inline void set_page_writeback(struct page *page) | |||
| 344 | * tests can be used in performance sensitive paths. PageCompound is | 342 | * tests can be used in performance sensitive paths. PageCompound is |
| 345 | * generally not used in hot code paths. | 343 | * generally not used in hot code paths. |
| 346 | */ | 344 | */ |
| 347 | __PAGEFLAG(Head, head) | 345 | __PAGEFLAG(Head, head) CLEARPAGEFLAG(Head, head) |
| 348 | __PAGEFLAG(Tail, tail) | 346 | __PAGEFLAG(Tail, tail) |
| 349 | 347 | ||
| 350 | static inline int PageCompound(struct page *page) | 348 | static inline int PageCompound(struct page *page) |
| @@ -352,6 +350,13 @@ static inline int PageCompound(struct page *page) | |||
| 352 | return page->flags & ((1L << PG_head) | (1L << PG_tail)); | 350 | return page->flags & ((1L << PG_head) | (1L << PG_tail)); |
| 353 | 351 | ||
| 354 | } | 352 | } |
| 353 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | ||
| 354 | static inline void ClearPageCompound(struct page *page) | ||
| 355 | { | ||
| 356 | BUG_ON(!PageHead(page)); | ||
| 357 | ClearPageHead(page); | ||
| 358 | } | ||
| 359 | #endif | ||
| 355 | #else | 360 | #else |
| 356 | /* | 361 | /* |
| 357 | * Reduce page flag use as much as possible by overlapping | 362 | * Reduce page flag use as much as possible by overlapping |
| @@ -389,14 +394,61 @@ static inline void __ClearPageTail(struct page *page) | |||
| 389 | page->flags &= ~PG_head_tail_mask; | 394 | page->flags &= ~PG_head_tail_mask; |
| 390 | } | 395 | } |
| 391 | 396 | ||
| 397 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | ||
| 398 | static inline void ClearPageCompound(struct page *page) | ||
| 399 | { | ||
| 400 | BUG_ON((page->flags & PG_head_tail_mask) != (1 << PG_compound)); | ||
| 401 | clear_bit(PG_compound, &page->flags); | ||
| 402 | } | ||
| 403 | #endif | ||
| 404 | |||
| 392 | #endif /* !PAGEFLAGS_EXTENDED */ | 405 | #endif /* !PAGEFLAGS_EXTENDED */ |
| 393 | 406 | ||
| 407 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | ||
| 408 | /* | ||
| 409 | * PageHuge() only returns true for hugetlbfs pages, but not for | ||
| 410 | * normal or transparent huge pages. | ||
| 411 | * | ||
| 412 | * PageTransHuge() returns true for both transparent huge and | ||
| 413 | * hugetlbfs pages, but not normal pages. PageTransHuge() can only be | ||
| 414 | * called only in the core VM paths where hugetlbfs pages can't exist. | ||
| 415 | */ | ||
| 416 | static inline int PageTransHuge(struct page *page) | ||
| 417 | { | ||
| 418 | VM_BUG_ON(PageTail(page)); | ||
| 419 | return PageHead(page); | ||
| 420 | } | ||
| 421 | |||
| 422 | static inline int PageTransCompound(struct page *page) | ||
| 423 | { | ||
| 424 | return PageCompound(page); | ||
| 425 | } | ||
| 426 | |||
| 427 | #else | ||
| 428 | |||
| 429 | static inline int PageTransHuge(struct page *page) | ||
| 430 | { | ||
| 431 | return 0; | ||
| 432 | } | ||
| 433 | |||
| 434 | static inline int PageTransCompound(struct page *page) | ||
| 435 | { | ||
| 436 | return 0; | ||
| 437 | } | ||
| 438 | #endif | ||
| 439 | |||
| 394 | #ifdef CONFIG_MMU | 440 | #ifdef CONFIG_MMU |
| 395 | #define __PG_MLOCKED (1 << PG_mlocked) | 441 | #define __PG_MLOCKED (1 << PG_mlocked) |
| 396 | #else | 442 | #else |
| 397 | #define __PG_MLOCKED 0 | 443 | #define __PG_MLOCKED 0 |
| 398 | #endif | 444 | #endif |
| 399 | 445 | ||
| 446 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | ||
| 447 | #define __PG_COMPOUND_LOCK (1 << PG_compound_lock) | ||
| 448 | #else | ||
| 449 | #define __PG_COMPOUND_LOCK 0 | ||
| 450 | #endif | ||
| 451 | |||
| 400 | /* | 452 | /* |
| 401 | * Flags checked when a page is freed. Pages being freed should not have | 453 | * Flags checked when a page is freed. Pages being freed should not have |
| 402 | * these flags set. It they are, there is a problem. | 454 | * these flags set. It they are, there is a problem. |
| @@ -404,9 +456,10 @@ static inline void __ClearPageTail(struct page *page) | |||
| 404 | #define PAGE_FLAGS_CHECK_AT_FREE \ | 456 | #define PAGE_FLAGS_CHECK_AT_FREE \ |
| 405 | (1 << PG_lru | 1 << PG_locked | \ | 457 | (1 << PG_lru | 1 << PG_locked | \ |
| 406 | 1 << PG_private | 1 << PG_private_2 | \ | 458 | 1 << PG_private | 1 << PG_private_2 | \ |
| 407 | 1 << PG_buddy | 1 << PG_writeback | 1 << PG_reserved | \ | 459 | 1 << PG_writeback | 1 << PG_reserved | \ |
| 408 | 1 << PG_slab | 1 << PG_swapcache | 1 << PG_active | \ | 460 | 1 << PG_slab | 1 << PG_swapcache | 1 << PG_active | \ |
| 409 | 1 << PG_unevictable | __PG_MLOCKED | __PG_HWPOISON) | 461 | 1 << PG_unevictable | __PG_MLOCKED | __PG_HWPOISON | \ |
| 462 | __PG_COMPOUND_LOCK) | ||
| 410 | 463 | ||
| 411 | /* | 464 | /* |
| 412 | * Flags checked when a page is prepped for return by the page allocator. | 465 | * Flags checked when a page is prepped for return by the page allocator. |
