Skip to content

Commit ad4b3fb

Browse files
chazytorvalds
authored andcommitted
mm: Fix PageHead when !CONFIG_PAGEFLAGS_EXTENDED
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 <cdall@cs.columbia.edu> Acked-by: Andrea Arcangeli <aarcange@redhat.com> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Will Deacon <Will.Deacon@arm.com> Cc: Steve Capper <Steve.Capper@arm.com> Cc: Christoph Lameter <cl@linux.com> Cc: stable@kernel.org # 2.6.26+ Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent 637704c commit ad4b3fb

File tree

1 file changed

+7
-1
lines changed

1 file changed

+7
-1
lines changed

include/linux/page-flags.h

+7-1
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ static inline void ClearPageCompound(struct page *page)
362362
* pages on the LRU and/or pagecache.
363363
*/
364364
TESTPAGEFLAG(Compound, compound)
365-
__PAGEFLAG(Head, compound)
365+
__SETPAGEFLAG(Head, compound) __CLEARPAGEFLAG(Head, compound)
366366

367367
/*
368368
* PG_reclaim is used in combination with PG_compound to mark the
@@ -374,8 +374,14 @@ __PAGEFLAG(Head, compound)
374374
* PG_compound & PG_reclaim => Tail page
375375
* PG_compound & ~PG_reclaim => Head page
376376
*/
377+
#define PG_head_mask ((1L << PG_compound))
377378
#define PG_head_tail_mask ((1L << PG_compound) | (1L << PG_reclaim))
378379

380+
static inline int PageHead(struct page *page)
381+
{
382+
return ((page->flags & PG_head_tail_mask) == PG_head_mask);
383+
}
384+
379385
static inline int PageTail(struct page *page)
380386
{
381387
return ((page->flags & PG_head_tail_mask) == PG_head_tail_mask);

0 commit comments

Comments
 (0)