diff options
Diffstat (limited to 'include/linux/ksm.h')
-rw-r--r-- | include/linux/ksm.h | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/include/linux/ksm.h b/include/linux/ksm.h index eb2a448981ee..a485c14ecd5d 100644 --- a/include/linux/ksm.h +++ b/include/linux/ksm.h | |||
@@ -10,6 +10,7 @@ | |||
10 | #include <linux/bitops.h> | 10 | #include <linux/bitops.h> |
11 | #include <linux/mm.h> | 11 | #include <linux/mm.h> |
12 | #include <linux/sched.h> | 12 | #include <linux/sched.h> |
13 | #include <linux/vmstat.h> | ||
13 | 14 | ||
14 | #ifdef CONFIG_KSM | 15 | #ifdef CONFIG_KSM |
15 | int ksm_madvise(struct vm_area_struct *vma, unsigned long start, | 16 | int ksm_madvise(struct vm_area_struct *vma, unsigned long start, |
@@ -29,6 +30,27 @@ static inline void ksm_exit(struct mm_struct *mm) | |||
29 | if (test_bit(MMF_VM_MERGEABLE, &mm->flags)) | 30 | if (test_bit(MMF_VM_MERGEABLE, &mm->flags)) |
30 | __ksm_exit(mm); | 31 | __ksm_exit(mm); |
31 | } | 32 | } |
33 | |||
34 | /* | ||
35 | * A KSM page is one of those write-protected "shared pages" or "merged pages" | ||
36 | * which KSM maps into multiple mms, wherever identical anonymous page content | ||
37 | * is found in VM_MERGEABLE vmas. It's a PageAnon page, with NULL anon_vma. | ||
38 | */ | ||
39 | static inline int PageKsm(struct page *page) | ||
40 | { | ||
41 | return ((unsigned long)page->mapping == PAGE_MAPPING_ANON); | ||
42 | } | ||
43 | |||
44 | /* | ||
45 | * But we have to avoid the checking which page_add_anon_rmap() performs. | ||
46 | */ | ||
47 | static inline void page_add_ksm_rmap(struct page *page) | ||
48 | { | ||
49 | if (atomic_inc_and_test(&page->_mapcount)) { | ||
50 | page->mapping = (void *) PAGE_MAPPING_ANON; | ||
51 | __inc_zone_page_state(page, NR_ANON_PAGES); | ||
52 | } | ||
53 | } | ||
32 | #else /* !CONFIG_KSM */ | 54 | #else /* !CONFIG_KSM */ |
33 | 55 | ||
34 | static inline int ksm_madvise(struct vm_area_struct *vma, unsigned long start, | 56 | static inline int ksm_madvise(struct vm_area_struct *vma, unsigned long start, |
@@ -45,6 +67,13 @@ static inline int ksm_fork(struct mm_struct *mm, struct mm_struct *oldmm) | |||
45 | static inline void ksm_exit(struct mm_struct *mm) | 67 | static inline void ksm_exit(struct mm_struct *mm) |
46 | { | 68 | { |
47 | } | 69 | } |
70 | |||
71 | static inline int PageKsm(struct page *page) | ||
72 | { | ||
73 | return 0; | ||
74 | } | ||
75 | |||
76 | /* No stub required for page_add_ksm_rmap(page) */ | ||
48 | #endif /* !CONFIG_KSM */ | 77 | #endif /* !CONFIG_KSM */ |
49 | 78 | ||
50 | #endif | 79 | #endif |