Skip to content

Commit

Permalink
mm: Fix PageHead when !CONFIG_PAGEFLAGS_EXTENDED
Browse files Browse the repository at this point in the history
Unfortunately with !CONFIG_PAGEFLAGS_EXTENDED, (!PageHead) is false, and
(PageHead) is true, for tail pages.  If this is indeed the intended
behavior, which I doubt because it breaks cache cleaning on some ARM
systems, then the nomenclature is highly problematic.

This patch makes sure PageHead is only true for head pages and PageTail
is only true for tail pages, and neither is true for non-compound pages.

[ This buglet seems ancient - seems to have been introduced back in Apr
  2008 in commit 6a1e7f7: "pageflags: convert to the use of new
  macros".  And the reason nobody noticed is because the PageHead()
  tests are almost all about just sanity-checking, and only used on
  pages that are actual page heads.  The fact that the old code returned
  true for tail pages too was thus not really noticeable.   - Linus ]

Signed-off-by: Christoffer Dall <[email protected]>
Acked-by:  Andrea Arcangeli <[email protected]>
Cc: Andrew Morton <[email protected]>
Cc: Will Deacon <[email protected]>
Cc: Steve Capper <[email protected]>
Cc: Christoph Lameter <[email protected]>
Cc: [email protected]  # 2.6.26+
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
chazy authored and torvalds committed Dec 26, 2012
1 parent 637704c commit ad4b3fb
Showing 1 changed file with 7 additions and 1 deletion.
8 changes: 7 additions & 1 deletion include/linux/page-flags.h
Original file line number Diff line number Diff line change
Expand Up @@ -362,7 +362,7 @@ static inline void ClearPageCompound(struct page *page)
* pages on the LRU and/or pagecache.
*/
TESTPAGEFLAG(Compound, compound)
__PAGEFLAG(Head, compound)
__SETPAGEFLAG(Head, compound) __CLEARPAGEFLAG(Head, compound)

/*
* PG_reclaim is used in combination with PG_compound to mark the
Expand All @@ -374,8 +374,14 @@ __PAGEFLAG(Head, compound)
* PG_compound & PG_reclaim => Tail page
* PG_compound & ~PG_reclaim => Head page
*/
#define PG_head_mask ((1L << PG_compound))
#define PG_head_tail_mask ((1L << PG_compound) | (1L << PG_reclaim))

static inline int PageHead(struct page *page)
{
return ((page->flags & PG_head_tail_mask) == PG_head_mask);
}

static inline int PageTail(struct page *page)
{
return ((page->flags & PG_head_tail_mask) == PG_head_tail_mask);
Expand Down

0 comments on commit ad4b3fb

Please sign in to comment.