diff options
-rw-r--r-- | include/linux/mm.h | 7 | ||||
-rw-r--r-- | mm/ksm.c | 18 | ||||
-rw-r--r-- | mm/util.c | 13 |
3 files changed, 20 insertions, 18 deletions
diff --git a/include/linux/mm.h b/include/linux/mm.h index 57a9fa34f159..0ac87d9ee9d8 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
@@ -2868,5 +2868,12 @@ void __init setup_nr_node_ids(void); | |||
2868 | static inline void setup_nr_node_ids(void) {} | 2868 | static inline void setup_nr_node_ids(void) {} |
2869 | #endif | 2869 | #endif |
2870 | 2870 | ||
2871 | extern int memcmp_pages(struct page *page1, struct page *page2); | ||
2872 | |||
2873 | static inline int pages_identical(struct page *page1, struct page *page2) | ||
2874 | { | ||
2875 | return !memcmp_pages(page1, page2); | ||
2876 | } | ||
2877 | |||
2871 | #endif /* __KERNEL__ */ | 2878 | #endif /* __KERNEL__ */ |
2872 | #endif /* _LINUX_MM_H */ | 2879 | #endif /* _LINUX_MM_H */ |
@@ -1029,24 +1029,6 @@ static u32 calc_checksum(struct page *page) | |||
1029 | return checksum; | 1029 | return checksum; |
1030 | } | 1030 | } |
1031 | 1031 | ||
1032 | static int memcmp_pages(struct page *page1, struct page *page2) | ||
1033 | { | ||
1034 | char *addr1, *addr2; | ||
1035 | int ret; | ||
1036 | |||
1037 | addr1 = kmap_atomic(page1); | ||
1038 | addr2 = kmap_atomic(page2); | ||
1039 | ret = memcmp(addr1, addr2, PAGE_SIZE); | ||
1040 | kunmap_atomic(addr2); | ||
1041 | kunmap_atomic(addr1); | ||
1042 | return ret; | ||
1043 | } | ||
1044 | |||
1045 | static inline int pages_identical(struct page *page1, struct page *page2) | ||
1046 | { | ||
1047 | return !memcmp_pages(page1, page2); | ||
1048 | } | ||
1049 | |||
1050 | static int write_protect_page(struct vm_area_struct *vma, struct page *page, | 1032 | static int write_protect_page(struct vm_area_struct *vma, struct page *page, |
1051 | pte_t *orig_pte) | 1033 | pte_t *orig_pte) |
1052 | { | 1034 | { |
@@ -783,3 +783,16 @@ out_mm: | |||
783 | out: | 783 | out: |
784 | return res; | 784 | return res; |
785 | } | 785 | } |
786 | |||
787 | int memcmp_pages(struct page *page1, struct page *page2) | ||
788 | { | ||
789 | char *addr1, *addr2; | ||
790 | int ret; | ||
791 | |||
792 | addr1 = kmap_atomic(page1); | ||
793 | addr2 = kmap_atomic(page2); | ||
794 | ret = memcmp(addr1, addr2, PAGE_SIZE); | ||
795 | kunmap_atomic(addr2); | ||
796 | kunmap_atomic(addr1); | ||
797 | return ret; | ||
798 | } | ||