[PATCH 00/16] Sanitize usage of ->flags and ->mapping for tail pages

From: Kirill A. Shutemov
Date: Thu Mar 19 2015 - 13:09:18 EST


Currently we take naive approach to page flags on compound -- we set the
flag on the page without consideration if the flag makes sense for tail
page or for compound page in general. This patchset try to sort this out
by defining per-flag policy on what need to be done if page-flag helper
operate on compound page.

The last patch in patchset also sanitize usege of page->mapping for tail
pages. We don't define meaning of page->mapping for tail pages. Currently
it's always NULL, which can be inconsistent with head page and potentially
lead to problems.

For now I catched one case of illigal usage of page flags or ->mapping:
sound subsystem allocates pages with __GFP_COMP and maps them with PTEs.
It leads to setting dirty bit on tail pages and access to tail_page's
->mapping. I don't see any bad behaviour caused by this, but worth fixing
anyway.

This patchset makes more sense if you take my THP refcounting into
account: we will see more compound pages mapped with PTEs and we need to
define behaviour of flags on compound pages to avoid bugs.

Kirill A. Shutemov (16):
mm: consolidate all page-flags helpers in <linux/page-flags.h>
page-flags: trivial cleanup for PageTrans* helpers
page-flags: introduce page flags policies wrt compound pages
page-flags: define PG_locked behavior on compound pages
page-flags: define behavior of FS/IO-related flags on compound pages
page-flags: define behavior of LRU-related flags on compound pages
page-flags: define behavior SL*B-related flags on compound pages
page-flags: define behavior of Xen-related flags on compound pages
page-flags: define PG_reserved behavior on compound pages
page-flags: define PG_swapbacked behavior on compound pages
page-flags: define PG_swapcache behavior on compound pages
page-flags: define PG_mlocked behavior on compound pages
page-flags: define PG_uncached behavior on compound pages
page-flags: define PG_uptodate behavior on compound pages
page-flags: look on head page if the flag is encoded in page->mapping
mm: sanitize page->mapping for tail pages

fs/cifs/file.c | 8 +-
include/linux/hugetlb.h | 7 -
include/linux/ksm.h | 17 ---
include/linux/mm.h | 122 +----------------
include/linux/page-flags.h | 317 ++++++++++++++++++++++++++++++++++-----------
include/linux/pagemap.h | 25 ++--
include/linux/poison.h | 4 +
mm/filemap.c | 15 ++-
mm/huge_memory.c | 2 +-
mm/ksm.c | 2 +-
mm/memory-failure.c | 2 +-
mm/memory.c | 2 +-
mm/migrate.c | 2 +-
mm/page_alloc.c | 7 +
mm/shmem.c | 4 +-
mm/slub.c | 2 +
mm/swap_state.c | 4 +-
mm/util.c | 5 +-
mm/vmscan.c | 4 +-
mm/zswap.c | 4 +-
20 files changed, 294 insertions(+), 261 deletions(-)

--
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/