Use of THP requires that the VMA containing the guest memory is 2MB aligned. Unfortunately, nothing in kvmtool ensures that the memory is actually aligned, making the use of THP very unlikely. Just follow what we're already doing for virtio, and expand our forced alignment to 2M. * without this patch: root@muffin-man:~# for i in $(seq 1 5); do ./hackbench 50 process 1000; done Running with 50*40 (== 2000) tasks. Time: 113.600 Running with 50*40 (== 2000) tasks. Time: 108.650 Running with 50*40 (== 2000) tasks. Time: 110.753 Running with 50*40 (== 2000) tasks. Time: 116.992 Running with 50*40 (== 2000) tasks. Time: 117.317 * with this patch: root@muffin-man:~# for i in $(seq 1 5); do ./hackbench 50 process 1000; done Running with 50*40 (== 2000) tasks. Time: 97.613 Running with 50*40 (== 2000) tasks. Time: 96.111 Running with 50*40 (== 2000) tasks. Time: 97.090 Running with 50*40 (== 2000) tasks. Time: 100.820 Running with 50*40 (== 2000) tasks. Time: 100.298 Acked-by: Will Deacon <will.deacon@xxxxxxx> Signed-off-by: Marc Zyngier <marc.zyngier@xxxxxxx> --- tools/kvm/arm/kvm.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/kvm/arm/kvm.c b/tools/kvm/arm/kvm.c index 008b7fe..d0d64ff 100644 --- a/tools/kvm/arm/kvm.c +++ b/tools/kvm/arm/kvm.c @@ -61,11 +61,13 @@ void kvm__arch_set_cmdline(char *cmdline, bool video) void kvm__arch_init(struct kvm *kvm, const char *hugetlbfs_path, u64 ram_size) { /* - * Allocate guest memory. We must align out buffer to 64K to + * Allocate guest memory. We must align our buffer to 64K to * correlate with the maximum guest page size for virtio-mmio. + * If using THP, then our minimal alignment becomes 2M. + * 2M trumps 64K, so let's go with that. */ kvm->ram_size = min(ram_size, (u64)ARM_MAX_MEMORY(kvm)); - kvm->arch.ram_alloc_size = kvm->ram_size + SZ_64K; + kvm->arch.ram_alloc_size = kvm->ram_size + SZ_2M; kvm->arch.ram_alloc_start = mmap_anon_or_hugetlbfs(kvm, hugetlbfs_path, kvm->arch.ram_alloc_size); @@ -74,7 +76,7 @@ void kvm__arch_init(struct kvm *kvm, const char *hugetlbfs_path, u64 ram_size) kvm->arch.ram_alloc_size, errno); kvm->ram_start = (void *)ALIGN((unsigned long)kvm->arch.ram_alloc_start, - SZ_64K); + SZ_2M); madvise(kvm->arch.ram_alloc_start, kvm->arch.ram_alloc_size, MADV_MERGEABLE); -- 1.8.3.4 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html