@@ -6,6 +6,7 @@ generic-y += export.h
generic-y += irq_work.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
+generic-y += page_memops.h
generic-y += preempt.h
generic-y += sections.h
generic-y += trace_clock.h
@@ -16,6 +16,7 @@ generic-y += local64.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
generic-y += msi.h
+generic-y += page_memops.h
generic-y += parport.h
generic-y += pci.h
generic-y += percpu.h
@@ -10,6 +10,7 @@ generic-y += local.h
generic-y += local64.h
generic-y += mm-arch-hooks.h
generic-y += msi.h
+generic-y += page_memops.h
generic-y += parport.h
generic-y += preempt.h
generic-y += rwsem.h
@@ -15,6 +15,7 @@ generic-y += local64.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
generic-y += msi.h
+generic-y += page_memops.h
generic-y += preempt.h
generic-y += rwsem.h
generic-y += segment.h
@@ -16,6 +16,7 @@ generic-y += local.h
generic-y += local64.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
+generic-y += page_memops.h
generic-y += percpu.h
generic-y += pgalloc.h
generic-y += preempt.h
@@ -23,6 +23,7 @@ generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
generic-y += mmu.h
generic-y += mmu_context.h
+generic-y += page_memops.h
generic-y += pci.h
generic-y += percpu.h
generic-y += pgalloc.h
@@ -21,6 +21,7 @@ generic-y += local64.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
generic-y += module.h
+generic-y += page_memops.h
generic-y += percpu.h
generic-y += preempt.h
generic-y += sections.h
@@ -7,6 +7,7 @@ generic-y += fb.h
generic-y += irq_work.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
+generic-y += page_memops.h
generic-y += preempt.h
generic-y += trace_clock.h
generic-y += word-at-a-time.h
@@ -31,6 +31,7 @@ generic-y += mm-arch-hooks.h
generic-y += mmu.h
generic-y += mmu_context.h
generic-y += module.h
+generic-y += page_memops.h
generic-y += parport.h
generic-y += percpu.h
generic-y += pgalloc.h
@@ -21,6 +21,7 @@ generic-y += local.h
generic-y += local64.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
+generic-y += page_memops.h
generic-y += pci.h
generic-y += percpu.h
generic-y += preempt.h
@@ -3,6 +3,7 @@ generic-y += exec.h
generic-y += irq_work.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
+generic-y += page_memops.h
generic-y += preempt.h
generic-y += trace_clock.h
generic-y += vtime.h
@@ -7,6 +7,7 @@ generic-y += kprobes.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
generic-y += module.h
+generic-y += page_memops.h
generic-y += preempt.h
generic-y += sections.h
generic-y += trace_clock.h
@@ -15,6 +15,7 @@ generic-y += local.h
generic-y += local64.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
+generic-y += page_memops.h
generic-y += percpu.h
generic-y += preempt.h
generic-y += sections.h
@@ -19,6 +19,7 @@ generic-y += local.h
generic-y += local64.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
+generic-y += page_memops.h
generic-y += pci.h
generic-y += percpu.h
generic-y += preempt.h
@@ -20,6 +20,7 @@ generic-y += local.h
generic-y += local64.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
+generic-y += page_memops.h
generic-y += parport.h
generic-y += percpu.h
generic-y += preempt.h
@@ -9,6 +9,7 @@ generic-y += irq_work.h
generic-y += local64.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
+generic-y += page_memops.h
generic-y += parport.h
generic-y += percpu.h
generic-y += preempt.h
@@ -8,6 +8,7 @@ generic-y += fb.h
generic-y += irq_work.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
+generic-y += page_memops.h
generic-y += preempt.h
generic-y += sections.h
generic-y += trace_clock.h
@@ -26,6 +26,7 @@ generic-y += local.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
generic-y += module.h
+generic-y += page_memops.h
generic-y += pci.h
generic-y += percpu.h
generic-y += preempt.h
@@ -25,6 +25,7 @@ generic-y += local.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
generic-y += module.h
+generic-y += page_memops.h
generic-y += pci.h
generic-y += percpu.h
generic-y += preempt.h
@@ -14,6 +14,7 @@ generic-y += local.h
generic-y += local64.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
+generic-y += page_memops.h
generic-y += percpu.h
generic-y += preempt.h
generic-y += seccomp.h
@@ -5,6 +5,7 @@ generic-y += irq_regs.h
generic-y += irq_work.h
generic-y += local64.h
generic-y += mcs_spinlock.h
+generic-y += page_memops.h
generic-y += preempt.h
generic-y += rwsem.h
generic-y += vtime.h
@@ -14,6 +14,7 @@ generic-y += local.h
generic-y += local64.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
+generic-y += page_memops.h
generic-y += preempt.h
generic-y += trace_clock.h
generic-y += word-at-a-time.h
@@ -5,6 +5,7 @@ generic-y += extable.h
generic-y += irq_work.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
+generic-y += page_memops.h
generic-y += preempt.h
generic-y += sections.h
generic-y += trace_clock.h
@@ -10,6 +10,7 @@ generic-y += local.h
generic-y += local64.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
+generic-y += page_memops.h
generic-y += parport.h
generic-y += percpu.h
generic-y += preempt.h
@@ -14,6 +14,7 @@ generic-y += local64.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
generic-y += module.h
+generic-y += page_memops.h
generic-y += preempt.h
generic-y += rwsem.h
generic-y += serial.h
@@ -11,6 +11,7 @@ generic-y += local.h
generic-y += local64.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
+generic-y += page_memops.h
generic-y += parport.h
generic-y += preempt.h
generic-y += seccomp.h
@@ -17,6 +17,7 @@ generic-y += irq_work.h
generic-y += kdebug.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
+generic-y += page_memops.h
generic-y += param.h
generic-y += pci.h
generic-y += percpu.h
@@ -21,6 +21,7 @@ generic-y += local.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
generic-y += module.h
+generic-y += page_memops.h
generic-y += parport.h
generic-y += percpu.h
generic-y += preempt.h
@@ -11,3 +11,4 @@ generic-y += dma-contiguous.h
generic-y += early_ioremap.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
+generic-y += page_memops.h
@@ -18,6 +18,7 @@ generic-y += local.h
generic-y += local64.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
+generic-y += page_memops.h
generic-y += param.h
generic-y += percpu.h
generic-y += preempt.h
new file mode 100644
@@ -0,0 +1,31 @@
+#ifndef _ASM_GENERIC_PAGE_MEMOPS_H
+#define _ASM_GENERIC_PAGE_MEMOPS_H
+
+#include <linux/mm_types.h>
+#include <linux/highmem.h>
+#include <linux/jhash.h>
+
+static inline u32 calc_page_checksum(struct page *page)
+{
+ void *addr = kmap_atomic(page);
+ u32 checksum;
+
+ checksum = jhash2(addr, PAGE_SIZE / 4, 17);
+ kunmap_atomic(addr);
+ return checksum;
+}
+
+static inline int memcmp_pages(struct page *page1, struct page *page2)
+{
+ char *addr1, *addr2;
+ int ret;
+
+ addr1 = kmap_atomic(page1);
+ addr2 = kmap_atomic(page2);
+ ret = memcmp(addr1, addr2, PAGE_SIZE);
+ kunmap_atomic(addr2);
+ kunmap_atomic(addr1);
+ return ret;
+}
+
+#endif
@@ -41,6 +41,7 @@
#include <linux/numa.h>
#include <asm/tlbflush.h>
+#include <asm/page_memops.h>
#include "internal.h"
#ifdef CONFIG_NUMA
@@ -982,28 +983,6 @@ static int unmerge_and_remove_all_rmap_items(void)
}
#endif /* CONFIG_SYSFS */
-static u32 calc_checksum(struct page *page)
-{
- u32 checksum;
- void *addr = kmap_atomic(page);
- checksum = jhash2(addr, PAGE_SIZE / 4, 17);
- kunmap_atomic(addr);
- return checksum;
-}
-
-static int memcmp_pages(struct page *page1, struct page *page2)
-{
- char *addr1, *addr2;
- int ret;
-
- addr1 = kmap_atomic(page1);
- addr2 = kmap_atomic(page2);
- ret = memcmp(addr1, addr2, PAGE_SIZE);
- kunmap_atomic(addr2);
- kunmap_atomic(addr1);
- return ret;
-}
-
static inline int pages_identical(struct page *page1, struct page *page2)
{
return !memcmp_pages(page1, page2);
@@ -2049,7 +2028,7 @@ static void cmp_and_merge_page(struct page *page, struct rmap_item *rmap_item)
* don't want to insert it in the unstable tree, and we don't want
* to waste our time searching for something identical to it there.
*/
- checksum = calc_checksum(page);
+ checksum = calc_page_checksum(page);
if (rmap_item->oldchecksum != checksum) {
rmap_item->oldchecksum = checksum;
return;
@@ -3055,7 +3034,7 @@ static int __init ksm_init(void)
int err;
/* The correct value depends on page size and endianness */
- zero_checksum = calc_checksum(ZERO_PAGE(0));
+ zero_checksum = calc_page_checksum(ZERO_PAGE(0));
/* Default to false for backwards compatibility */
ksm_use_zero_pages = false;
This is just a refactoring of the existing code: * Split the page checksum and page comparison functions from ksm.c into a new asm-generic header (page_memops.h) * Add a line in every Kbuild of every arch, to use the generic version of page_memops.h Signed-off-by: Claudio Imbrenda <imbrenda@linux.vnet.ibm.com> --- arch/alpha/include/asm/Kbuild | 1 + arch/arc/include/asm/Kbuild | 1 + arch/arm/include/asm/Kbuild | 1 + arch/arm64/include/asm/Kbuild | 1 + arch/blackfin/include/asm/Kbuild | 1 + arch/c6x/include/asm/Kbuild | 1 + arch/cris/include/asm/Kbuild | 1 + arch/frv/include/asm/Kbuild | 1 + arch/h8300/include/asm/Kbuild | 1 + arch/hexagon/include/asm/Kbuild | 1 + arch/ia64/include/asm/Kbuild | 1 + arch/m32r/include/asm/Kbuild | 1 + arch/m68k/include/asm/Kbuild | 1 + arch/metag/include/asm/Kbuild | 1 + arch/microblaze/include/asm/Kbuild | 1 + arch/mips/include/asm/Kbuild | 1 + arch/mn10300/include/asm/Kbuild | 1 + arch/nios2/include/asm/Kbuild | 1 + arch/openrisc/include/asm/Kbuild | 1 + arch/parisc/include/asm/Kbuild | 1 + arch/powerpc/include/asm/Kbuild | 1 + arch/s390/include/asm/Kbuild | 1 + arch/score/include/asm/Kbuild | 1 + arch/sh/include/asm/Kbuild | 1 + arch/sparc/include/asm/Kbuild | 1 + arch/tile/include/asm/Kbuild | 1 + arch/um/include/asm/Kbuild | 1 + arch/unicore32/include/asm/Kbuild | 1 + arch/x86/include/asm/Kbuild | 1 + arch/xtensa/include/asm/Kbuild | 1 + include/asm-generic/page_memops.h | 31 +++++++++++++++++++++++++++++++ mm/ksm.c | 27 +++------------------------ 32 files changed, 64 insertions(+), 24 deletions(-) create mode 100644 include/asm-generic/page_memops.h