diff options
author | Hugh Dickins <hugh.dickins@tiscali.co.uk> | 2009-12-14 20:58:57 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-15 11:53:17 -0500 |
commit | 3ca7b3c5b64d35fe02c35b5d44c2c58b49499fee (patch) | |
tree | bb6af24d3683788ef658282f8794af19d2232663 /include/linux/ksm.h | |
parent | bb3ab596832b920c703d1aea1ce76d69c0f71fb7 (diff) |
mm: define PAGE_MAPPING_FLAGS
At present we define PageAnon(page) by the low PAGE_MAPPING_ANON bit set
in page->mapping, with the higher bits a pointer to the anon_vma; and have
defined PageKsm(page) as that with NULL anon_vma.
But KSM swapping will need to store a pointer there: so in preparation for
that, now define PAGE_MAPPING_FLAGS as the low two bits, including
PAGE_MAPPING_KSM (always set along with PAGE_MAPPING_ANON, until some
other use for the bit emerges).
Declare page_rmapping(page) to return the pointer part of page->mapping,
and page_anon_vma(page) to return the anon_vma pointer when that's what it
is. Use these in a few appropriate places: notably, unuse_vma() has been
testing page->mapping, but is better to be testing page_anon_vma() (cases
may be added in which flag bits are set without any pointer).
Signed-off-by: Hugh Dickins <hugh.dickins@tiscali.co.uk>
Cc: Izik Eidus <ieidus@redhat.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: Nick Piggin <npiggin@suse.de>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Reviewed-by: Rik van Riel <riel@redhat.com>
Cc: Lee Schermerhorn <Lee.Schermerhorn@hp.com>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: Wu Fengguang <fengguang.wu@intel.com>
Cc: Minchan Kim <minchan.kim@gmail.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 | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/include/linux/ksm.h b/include/linux/ksm.h index a485c14ecd5d..1401a313fa77 100644 --- a/include/linux/ksm.h +++ b/include/linux/ksm.h | |||
@@ -38,7 +38,8 @@ static inline void ksm_exit(struct mm_struct *mm) | |||
38 | */ | 38 | */ |
39 | static inline int PageKsm(struct page *page) | 39 | static inline int PageKsm(struct page *page) |
40 | { | 40 | { |
41 | return ((unsigned long)page->mapping == PAGE_MAPPING_ANON); | 41 | return ((unsigned long)page->mapping & PAGE_MAPPING_FLAGS) == |
42 | (PAGE_MAPPING_ANON | PAGE_MAPPING_KSM); | ||
42 | } | 43 | } |
43 | 44 | ||
44 | /* | 45 | /* |
@@ -47,7 +48,7 @@ static inline int PageKsm(struct page *page) | |||
47 | static inline void page_add_ksm_rmap(struct page *page) | 48 | static inline void page_add_ksm_rmap(struct page *page) |
48 | { | 49 | { |
49 | if (atomic_inc_and_test(&page->_mapcount)) { | 50 | if (atomic_inc_and_test(&page->_mapcount)) { |
50 | page->mapping = (void *) PAGE_MAPPING_ANON; | 51 | page->mapping = (void *) (PAGE_MAPPING_ANON | PAGE_MAPPING_KSM); |
51 | __inc_zone_page_state(page, NR_ANON_PAGES); | 52 | __inc_zone_page_state(page, NR_ANON_PAGES); |
52 | } | 53 | } |
53 | } | 54 | } |