1
0
Fork 0

ksm: replace jhash2 with xxhash

Replace jhash2 with xxhash.

Perf numbers:
Intel(R) Xeon(R) CPU E5-2420 v2 @ 2.20GHz
ksm: crc32c   hash() 12081 MB/s
ksm: xxh64    hash()  8770 MB/s
ksm: xxh32    hash()  4529 MB/s
ksm: jhash2   hash()  1569 MB/s

Sioh Lee did some testing:

crc32c_intel: 1084.10ns
crc32c (no hardware acceleration): 7012.51ns
xxhash32: 2227.75ns
xxhash64: 1413.16ns
jhash2: 5128.30ns

As jhash2 always will be slower (for data size like PAGE_SIZE).  Don't use
it in ksm at all.

Use only xxhash for now, because for using crc32c, cryptoapi must be
initialized first - that requires some tricky solution to work well in all
situations.

Link: http://lkml.kernel.org/r/20181023182554.23464-3-nefelim4ag@gmail.com
Signed-off-by: Timofey Titovets <nefelim4ag@gmail.com>
Signed-off-by: leesioh <solee@os.korea.ac.kr>
Reviewed-by: Pavel Tatashin <pavel.tatashin@microsoft.com>
Reviewed-by: Mike Rapoport <rppt@linux.vnet.ibm.com>
Reviewed-by: Andrew Morton <akpm@linux-foundation.org>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
hifive-unleashed-5.1
Timofey Titovets 2018-12-28 00:34:05 -08:00 committed by Linus Torvalds
parent 0b9df58b79
commit 59e1a2f4bf
2 changed files with 3 additions and 2 deletions

View File

@ -291,6 +291,7 @@ config MMU_NOTIFIER
config KSM config KSM
bool "Enable KSM for page merging" bool "Enable KSM for page merging"
depends on MMU depends on MMU
select XXHASH
help help
Enable Kernel Samepage Merging: KSM periodically scans those areas Enable Kernel Samepage Merging: KSM periodically scans those areas
of an application's address space that an app has advised may be of an application's address space that an app has advised may be

View File

@ -25,7 +25,7 @@
#include <linux/pagemap.h> #include <linux/pagemap.h>
#include <linux/rmap.h> #include <linux/rmap.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/jhash.h> #include <linux/xxhash.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/kthread.h> #include <linux/kthread.h>
#include <linux/wait.h> #include <linux/wait.h>
@ -1009,7 +1009,7 @@ static u32 calc_checksum(struct page *page)
{ {
u32 checksum; u32 checksum;
void *addr = kmap_atomic(page); void *addr = kmap_atomic(page);
checksum = jhash2(addr, PAGE_SIZE / 4, 17); checksum = xxhash(addr, PAGE_SIZE, 0);
kunmap_atomic(addr); kunmap_atomic(addr);
return checksum; return checksum;
} }