diff options
author | Kirill A. Shutemov <kirill.shutemov@linux.intel.com> | 2015-04-15 19:13:08 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-04-15 19:35:17 -0400 |
commit | e8c6158fef15a1532bd5242a0cd88565eedabe61 (patch) | |
tree | 82f931e8dc18bd776ea32e745a7706574186ded8 /include/linux/ksm.h | |
parent | 64d37a2baf5e5c0f1009c0ef290a9027de721d66 (diff) |
mm: consolidate all page-flags helpers in <linux/page-flags.h>
Currently we take a naive approach to page flags on compound pages - 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 the patchset also sanitizes usege of page->mapping for
tail pages. We don't define the 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 caught one case of illegal 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.
This patch (of 16):
We have page-flags helper function declarations/definitions spread over
several header files. Let's consolidate them in <linux/page-flags.h>.
Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Acked-by: Hugh Dickins <hughd@google.com>
Cc: Dave Hansen <dave.hansen@intel.com>
Cc: Mel Gorman <mgorman@suse.de>
Cc: Rik van Riel <riel@redhat.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: Christoph Lameter <cl@linux.com>
Cc: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
Cc: Steve Capper <steve.capper@linaro.org>
Cc: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Michal Hocko <mhocko@suse.cz>
Cc: Jerome Marchand <jmarchan@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux/ksm.h')
-rw-r--r-- | include/linux/ksm.h | 17 |
1 files changed, 0 insertions, 17 deletions
diff --git a/include/linux/ksm.h b/include/linux/ksm.h index 3be6bb18562d..7ae216a39c9e 100644 --- a/include/linux/ksm.h +++ b/include/linux/ksm.h | |||
@@ -35,18 +35,6 @@ static inline void ksm_exit(struct mm_struct *mm) | |||
35 | __ksm_exit(mm); | 35 | __ksm_exit(mm); |
36 | } | 36 | } |
37 | 37 | ||
38 | /* | ||
39 | * A KSM page is one of those write-protected "shared pages" or "merged pages" | ||
40 | * which KSM maps into multiple mms, wherever identical anonymous page content | ||
41 | * is found in VM_MERGEABLE vmas. It's a PageAnon page, pointing not to any | ||
42 | * anon_vma, but to that page's node of the stable tree. | ||
43 | */ | ||
44 | static inline int PageKsm(struct page *page) | ||
45 | { | ||
46 | return ((unsigned long)page->mapping & PAGE_MAPPING_FLAGS) == | ||
47 | (PAGE_MAPPING_ANON | PAGE_MAPPING_KSM); | ||
48 | } | ||
49 | |||
50 | static inline struct stable_node *page_stable_node(struct page *page) | 38 | static inline struct stable_node *page_stable_node(struct page *page) |
51 | { | 39 | { |
52 | return PageKsm(page) ? page_rmapping(page) : NULL; | 40 | return PageKsm(page) ? page_rmapping(page) : NULL; |
@@ -87,11 +75,6 @@ static inline void ksm_exit(struct mm_struct *mm) | |||
87 | { | 75 | { |
88 | } | 76 | } |
89 | 77 | ||
90 | static inline int PageKsm(struct page *page) | ||
91 | { | ||
92 | return 0; | ||
93 | } | ||
94 | |||
95 | #ifdef CONFIG_MMU | 78 | #ifdef CONFIG_MMU |
96 | static inline int ksm_madvise(struct vm_area_struct *vma, unsigned long start, | 79 | static inline int ksm_madvise(struct vm_area_struct *vma, unsigned long start, |
97 | unsigned long end, int advice, unsigned long *vm_flags) | 80 | unsigned long end, int advice, unsigned long *vm_flags) |