From mboxrd@z Thu Jan 1 00:00:00 1970 From: Marcelo Tosatti Subject: KVM: MMU: improve n_max_mmu_pages calculation with TDP Date: Wed, 20 Mar 2013 17:14:20 -0300 Message-ID: <20130320201420.GA17347@amt.cnet> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: Xiao Guangrong , Takuya Yoshikawa , Avi Kivity To: kvm , Ulrich Obergfell Return-path: Received: from mx1.redhat.com ([209.132.183.28]:28972 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752430Ab3CTUP2 (ORCPT ); Wed, 20 Mar 2013 16:15:28 -0400 Content-Disposition: inline Sender: kvm-owner@vger.kernel.org List-ID: kvm_mmu_calculate_mmu_pages numbers, maximum number of shadow pages = 2% of mapped guest pages Does not make sense for TDP guests where mapping all of guest memory with 4k pages cannot exceed "mapped guest pages / 512" (not counting root pages). Allow that maximum for TDP, forcing the guest to recycle otherwise. Signed-off-by: Marcelo Tosatti diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 956ca35..a9694a8d7 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c @@ -4293,7 +4293,7 @@ nomem: unsigned int kvm_mmu_calculate_mmu_pages(struct kvm *kvm) { unsigned int nr_mmu_pages; - unsigned int nr_pages = 0; + unsigned int i, nr_pages = 0; struct kvm_memslots *slots; struct kvm_memory_slot *memslot; @@ -4302,7 +4302,19 @@ unsigned int kvm_mmu_calculate_mmu_pages(struct kvm *kvm) kvm_for_each_memslot(memslot, slots) nr_pages += memslot->npages; - nr_mmu_pages = nr_pages * KVM_PERMILLE_MMU_PAGES / 1000; + if (tdp_enabled) { + /* one root page */ + nr_mmu_pages = 1; + /* nr_pages / (512^i) per level, due to + * guest RAM map being linear */ + for (i = 1; i < 4; i++) { + int nr_pages_round = nr_pages + (1 << (9*i)); + nr_mmu_pages += nr_pages_round >> (9*i); + } + } else { + nr_mmu_pages = nr_pages * KVM_PERMILLE_MMU_PAGES / 1000; + } + nr_mmu_pages = max(nr_mmu_pages, (unsigned int) KVM_MIN_ALLOC_MMU_PAGES);