From patchwork Tue Feb 18 21:07:14 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Christopherson X-Patchwork-Id: 11389589 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 8E1151395 for ; Tue, 18 Feb 2020 21:08:14 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 6CA8C24125 for ; Tue, 18 Feb 2020 21:08:14 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="XZVb9Vcr" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6CA8C24125 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:To :From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=Fx+ckPW8OIm9liR8Grugk7qQqWtucHUwv7naVzJo8hE=; b=XZVb9VcrL+mowH Zk6seqlZ6a3IC1UfG5GXXyCHI3kIW+LDKCaDwYXSSAMQ4nHy9PHSBzfjE0MouK9hrGVTCdFTURRuO 7n+E4ewox+5PROLoiSSfHTp9Q91ypaHZyNQkrweOFxOJqeymj598xjyPsYKcweDOMuNunUDAoWiaG iCt/jWO4qZVWSh0wlddpLAtmRNuJIOsuuoNKRuJYdqNmrgDEHD9sGiv6kNFfcqVnmmxoSjougqc+I pEPdw+ydhW/uwPnVQzNVKsBgaXcppu8VGF4XxCgcYYjC1UgmBsy2Nw4Az+g44oKLUZnYxto0JYlJe Uu7WDtFbdeInFUlNnHSQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1j4A6C-0001Hg-0e; Tue, 18 Feb 2020 21:08:08 +0000 Received: from mga01.intel.com ([192.55.52.88]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1j4A5p-0000z9-UL for linux-arm-kernel@lists.infradead.org; Tue, 18 Feb 2020 21:07:47 +0000 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 18 Feb 2020 13:07:44 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.70,457,1574150400"; d="scan'208";a="253856390" Received: from sjchrist-coffee.jf.intel.com ([10.54.74.202]) by orsmga002.jf.intel.com with ESMTP; 18 Feb 2020 13:07:44 -0800 From: Sean Christopherson To: Paolo Bonzini Subject: [PATCH v6 00/22] KVM: Dynamically size memslot arrays Date: Tue, 18 Feb 2020 13:07:14 -0800 Message-Id: <20200218210736.16432-1-sean.j.christopherson@intel.com> X-Mailer: git-send-email 2.24.1 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200218_130745_994797_E725D87D X-CRM114-Status: GOOD ( 15.35 ) X-Spam-Score: -5.0 (-----) X-Spam-Report: SpamAssassin version 3.4.3 on bombadil.infradead.org summary: Content analysis details: (-5.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -5.0 RCVD_IN_DNSWL_HI RBL: Sender listed at https://www.dnswl.org/, high trust [192.55.52.88 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record 0.0 RCVD_IN_MSPIKE_H3 RBL: Good reputation (+3) [192.55.52.88 listed in wl.mailspike.net] 0.0 RCVD_IN_MSPIKE_WL Mailspike good senders X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Wanpeng Li , kvm@vger.kernel.org, David Hildenbrand , Peter Xu , linux-mips@vger.kernel.org, Paul Mackerras , kvmarm@lists.cs.columbia.edu, Janosch Frank , Marc Zyngier , Joerg Roedel , Christian Borntraeger , Julien Thierry , Suzuki K Poulose , kvm-ppc@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Jim Mattson , Cornelia Huck , Christoffer Dall , Sean Christopherson , linux-kernel@vger.kernel.org, James Morse , Vitaly Kuznetsov , =?utf-8?q?Philippe_Mathieu-Daud?= =?utf-8?q?=C3=A9?= Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org The end goal of this series is to dynamically size the memslot array so that KVM allocates memory based on the number of memslots in use, as opposed to unconditionally allocating memory for the maximum number of memslots. On x86, each memslot consumes 88 bytes, and so with 2 address spaces of 512 memslots, each VM consumes ~90k bytes for the memslots. E.g. given a VM that uses a total of 30 memslots, dynamic sizing reduces the memory footprint from 90k to ~2.6k bytes. The changes required to support dynamic sizing are relatively small, e.g. are essentially contained in patches 17 and 18. Patches 2-16 clean up the memslot code, which has gotten quite crusty, especially __kvm_set_memory_region(). The clean up is likely not strictly necessary to switch to dynamic sizing, but I didn't have a remotely reasonable level of confidence in the correctness of the dynamic sizing without first doing the clean up. v6: - Rebase to kvm/queue, 2c2787938512 ("KVM: selftests: Stop memslot ...") - Collect tags. [Peter] - Add a paragraph in the changelog for patch 16 to explain why kvm_arch_sync_dirty_log() is moved from s390 to generic code. [Peter] - Expand a comment in patch 12 to explain why a copy of the old memslot needs to be made in __kvm_set_memory_region() even when deleting a slot. [Peter] - Expand a comment in patch 14 to explain why @tmp is nullified after copying it by value. [Peter]. - Stuff a non-canonical value into userspace_addr when deleting a private memslot (on x86). [Peter] - Use kvm_arch_flush_remote_tlbs_memslot() as the name for the new arch hook to flush TLB entries for a specific memslot during KVM_{CLEAR,GET}_DIRTY_LOG. [Peter] - Drop Christoffer's Acked-by and Tested-by for patch 15 due to the above rename. - Add patches 20-22 to use kvm_flush_remote_tlbs_with_address() in kvm_arch_flush_remote_tlbs_memslot() and consolidate existing open coded versions of kvm_arch_flush_remote_tlbs_memslot(). v5: - Make the selftest x86-only. [Christian]. - Collect tags. [Peter] - Rebase to kvm/queue, fb0c5f8fb698 ("KVM: x86: inline memslot_..."). v4: - Add patch 01 to fix an x86 rmap/lpage bug, and patches 10 and 11 to resolve hidden conflicts with the bug fix. - Collect tags [Christian, Marc, Philippe]. - Rebase to kvm/queue, commit e41a90be9659 ("KVM: x86/mmu: WARN if root_hpa is invalid when handling a page fault"). v3: - Fix build errors on PPC and MIPS due to missed params during refactoring [kbuild test robot]. - Rename the helpers for update_memslots() and add comments describing the new algorithm and how it interacts with searching [Paolo]. - Remove the unnecessary and obnoxious warning regarding memslots being a flexible array [Paolo]. - Fix typos in the changelog of patch 09/15 [Christoffer]. - Collect tags [Christoffer]. v2: - Split "Drop kvm_arch_create_memslot()" into three patches to move minor functional changes to standalone patches [Janosch]. - Rebase to latest kvm/queue (f0574a1cea5b, "KVM: x86: fix ...") - Collect an Acked-by and a Reviewed-by Sean Christopherson (22): KVM: x86: Allocate new rmap and large page tracking when moving memslot KVM: Reinstall old memslots if arch preparation fails KVM: Don't free new memslot if allocation of said memslot fails KVM: PPC: Move memslot memory allocation into prepare_memory_region() KVM: x86: Allocate memslot resources during prepare_memory_region() KVM: Drop kvm_arch_create_memslot() KVM: Explicitly free allocated-but-unused dirty bitmap KVM: Refactor error handling for setting memory region KVM: Move setting of memslot into helper routine KVM: Drop "const" attribute from old memslot in commit_memory_region() KVM: x86: Free arrays for old memslot when moving memslot's base gfn KVM: Move memslot deletion to helper function KVM: Simplify kvm_free_memslot() and all its descendents KVM: Clean up local variable usage in __kvm_set_memory_region() KVM: Provide common implementation for generic dirty log functions KVM: Ensure validity of memslot with respect to kvm_get_dirty_log() KVM: Terminate memslot walks via used_slots KVM: Dynamically size memslot array based on number of used slots KVM: selftests: Add test for KVM_SET_USER_MEMORY_REGION KVM: x86/mmu: Move kvm_arch_flush_remote_tlbs_memslot() to mmu.c KVM: x86/mmu: Use ranged-based TLB flush for dirty log memslot flush KVM: x86/mmu: Consolidate open coded variants of memslot TLB flushes arch/mips/include/asm/kvm_host.h | 2 +- arch/mips/kvm/mips.c | 71 +- arch/powerpc/include/asm/kvm_ppc.h | 17 +- arch/powerpc/kvm/book3s.c | 22 +- arch/powerpc/kvm/book3s_hv.c | 36 +- arch/powerpc/kvm/book3s_pr.c | 20 +- arch/powerpc/kvm/booke.c | 17 +- arch/powerpc/kvm/powerpc.c | 15 +- arch/s390/include/asm/kvm_host.h | 2 +- arch/s390/kvm/kvm-s390.c | 23 +- arch/x86/include/asm/kvm_page_track.h | 3 +- arch/x86/kvm/mmu/mmu.c | 42 +- arch/x86/kvm/mmu/page_track.c | 15 +- arch/x86/kvm/x86.c | 120 +--- include/linux/kvm_host.h | 48 +- tools/testing/selftests/kvm/.gitignore | 1 + tools/testing/selftests/kvm/Makefile | 1 + .../testing/selftests/kvm/include/kvm_util.h | 1 + tools/testing/selftests/kvm/lib/kvm_util.c | 30 + .../kvm/x86_64/set_memory_region_test.c | 142 ++++ virt/kvm/arm/arm.c | 48 +- virt/kvm/arm/mmu.c | 20 +- virt/kvm/kvm_main.c | 624 ++++++++++++------ 23 files changed, 754 insertions(+), 566 deletions(-) create mode 100644 tools/testing/selftests/kvm/x86_64/set_memory_region_test.c