Received: by 2002:a05:6a10:8a4d:0:0:0:0 with SMTP id dn13csp1080189pxb; Fri, 13 Aug 2021 13:03:33 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy8COUhMJ+TymE+bbH3GAvv9XZXWkfvCgEkwwFkOhGIiG7xIB9AWkzGZjZgHhMXhUtZDyGR X-Received: by 2002:a05:6402:148:: with SMTP id s8mr5237003edu.298.1628885013272; Fri, 13 Aug 2021 13:03:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1628885013; cv=none; d=google.com; s=arc-20160816; b=H8dPLrRaJ2ouim0qtqD36tYwDj0PszrcsGcreKaEt/KgtWVgLvfjapGXnwTD/aZSxC MOSiCTO7z29qMZyg8+/7wCNfygpkj5Ihcs0hnJeo9T2GBgXqZOYbVw5zcetBwiuo2cXV BDP26T1KAs4aGEkRsiHY1uKaNi7g5kArIHFPjIxPixvEU4hFxjNFlxglh4Xh8hHvSmA/ HG9BtNlMIUaWXHyZytp4qbWS8Ku9xu4+FEOdxefrQZeh7fHrZIdThqRRGDqrwsESZ07Y wxst6HE+99pOfoZj8XunnIxc2V2s5n95mYjJQZwyS5PnFO5g412syQ1fB5Fxl33akIxt NIqQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=ZKnORLfHy2SS+6eZk1dZAYfN9DB3S9IUif6JDE8FkKo=; b=XDC6kPEwFPghlKQoQNmHXwUIMre+4excW1ai4RWsZArqFdy4NXypyoPZnmlFqSOnTZ o/NibD1D94VkqT8DGnzHTAQD4ICnbpRlY4dlJQW3aynH6K6IvHO/vJg5Pc7eBrM7qXdo 1Agq2MnYQFXNKjUb79CndcD47fkU59Sx7eOfSvqcFPJpyicucPT2jemzmVeJKowdUiTS 4b6cMOa8teEjP9JjYXMyfexPkIhvFlSUorewCUXiqCl9MTVyFCmZSKEvIePc1YN+w25I XjlrWK3Vy7Z07lT5OO+BHf2ECovAsfC4QAWo0ODLxp3SP1Al0xjHYT6ZjHpr6Wstu5lM ic6A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id cb24si2347269ejb.612.2021.08.13.13.03.10; Fri, 13 Aug 2021 13:03:33 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234313AbhHMUBg (ORCPT + 99 others); Fri, 13 Aug 2021 16:01:36 -0400 Received: from vps-vb.mhejs.net ([37.28.154.113]:50316 "EHLO vps-vb.mhejs.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234226AbhHMUBd (ORCPT ); Fri, 13 Aug 2021 16:01:33 -0400 Received: from MUA by vps-vb.mhejs.net with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1mEcvx-00041O-91; Fri, 13 Aug 2021 21:33:37 +0200 From: "Maciej S. Szmigiero" To: Paolo Bonzini , Vitaly Kuznetsov Cc: Sean Christopherson , Wanpeng Li , Jim Mattson , Igor Mammedov , Marc Zyngier , James Morse , Julien Thierry , Suzuki K Poulose , Huacai Chen , Aleksandar Markovic , Paul Mackerras , Christian Borntraeger , Janosch Frank , David Hildenbrand , Cornelia Huck , Claudio Imbrenda , Joerg Roedel , kvm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 01/13] KVM: x86: Cache total page count to avoid traversing the memslot array Date: Fri, 13 Aug 2021 21:33:14 +0200 Message-Id: X-Mailer: git-send-email 2.32.0 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: "Maciej S. Szmigiero" There is no point in recalculating from scratch the total number of pages in all memslots each time a memslot is created or deleted. Just cache the value and update it accordingly on each such operation so the code doesn't need to traverse the whole memslot array each time. Signed-off-by: Maciej S. Szmigiero --- arch/x86/include/asm/kvm_host.h | 2 +- arch/x86/kvm/mmu/mmu.c | 24 ------------------------ arch/x86/kvm/x86.c | 18 +++++++++++++++--- 3 files changed, 16 insertions(+), 28 deletions(-) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 20daaf67a5bf..fa35408b6155 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1025,6 +1025,7 @@ struct kvm_x86_msr_filter { #define APICV_INHIBIT_REASON_X2APIC 5 struct kvm_arch { + u64 n_memslots_pages; unsigned long n_used_mmu_pages; unsigned long n_requested_mmu_pages; unsigned long n_max_mmu_pages; @@ -1552,7 +1553,6 @@ void kvm_mmu_slot_leaf_clear_dirty(struct kvm *kvm, const struct kvm_memory_slot *memslot); void kvm_mmu_zap_all(struct kvm *kvm); void kvm_mmu_invalidate_mmio_sptes(struct kvm *kvm, u64 gen); -unsigned long kvm_mmu_calculate_default_mmu_pages(struct kvm *kvm); void kvm_mmu_change_mmu_pages(struct kvm *kvm, unsigned long kvm_nr_mmu_pages); int load_pdptrs(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, unsigned long cr3); diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c index a272ccbddfa1..708ffc3bf1e0 100644 --- a/arch/x86/kvm/mmu/mmu.c +++ b/arch/x86/kvm/mmu/mmu.c @@ -6046,30 +6046,6 @@ int kvm_mmu_module_init(void) return ret; } -/* - * Calculate mmu pages needed for kvm. - */ -unsigned long kvm_mmu_calculate_default_mmu_pages(struct kvm *kvm) -{ - unsigned long nr_mmu_pages; - unsigned long nr_pages = 0; - struct kvm_memslots *slots; - struct kvm_memory_slot *memslot; - int i; - - for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) { - slots = __kvm_memslots(kvm, i); - - kvm_for_each_memslot(memslot, slots) - nr_pages += memslot->npages; - } - - nr_mmu_pages = nr_pages * KVM_PERMILLE_MMU_PAGES / 1000; - nr_mmu_pages = max(nr_mmu_pages, KVM_MIN_ALLOC_MMU_PAGES); - - return nr_mmu_pages; -} - void kvm_mmu_destroy(struct kvm_vcpu *vcpu) { kvm_mmu_unload(vcpu); diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index fdc0c18339fb..6f9d9c7457d7 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -11588,9 +11588,21 @@ void kvm_arch_commit_memory_region(struct kvm *kvm, const struct kvm_memory_slot *new, enum kvm_mr_change change) { - if (!kvm->arch.n_requested_mmu_pages) - kvm_mmu_change_mmu_pages(kvm, - kvm_mmu_calculate_default_mmu_pages(kvm)); + if (change == KVM_MR_CREATE) + kvm->arch.n_memslots_pages += new->npages; + else if (change == KVM_MR_DELETE) { + WARN_ON(kvm->arch.n_memslots_pages < old->npages); + kvm->arch.n_memslots_pages -= old->npages; + } + + if (!kvm->arch.n_requested_mmu_pages) { + unsigned long nr_mmu_pages; + + nr_mmu_pages = kvm->arch.n_memslots_pages * + KVM_PERMILLE_MMU_PAGES / 1000; + nr_mmu_pages = max(nr_mmu_pages, KVM_MIN_ALLOC_MMU_PAGES); + kvm_mmu_change_mmu_pages(kvm, nr_mmu_pages); + } kvm_mmu_slot_apply_flags(kvm, old, new, change);