From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-3.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=no autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E48CFC33CAF for ; Tue, 21 Jan 2020 22:33:49 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id C4CD72465B for ; Tue, 21 Jan 2020 22:33:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726442AbgAUWcD (ORCPT ); Tue, 21 Jan 2020 17:32:03 -0500 Received: from mga14.intel.com ([192.55.52.115]:1733 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725876AbgAUWcD (ORCPT ); Tue, 21 Jan 2020 17:32:03 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 21 Jan 2020 14:32:02 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.70,347,1574150400"; d="scan'208";a="244845094" Received: from sjchrist-coffee.jf.intel.com ([10.54.74.202]) by orsmga002.jf.intel.com with ESMTP; 21 Jan 2020 14:32:02 -0800 From: Sean Christopherson To: Paolo Bonzini Cc: Paul Mackerras , Christian Borntraeger , Janosch Frank , David Hildenbrand , Cornelia Huck , Sean Christopherson , Vitaly Kuznetsov , Wanpeng Li , Jim Mattson , Joerg Roedel , Marc Zyngier , James Morse , Julien Thierry , Suzuki K Poulose , linux-mips@vger.kernel.org, kvm@vger.kernel.org, kvm-ppc@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu, linux-kernel@vger.kernel.org, Christoffer Dall , Peter Xu , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v5 00/19] KVM: Dynamically size memslot arrays Date: Tue, 21 Jan 2020 14:31:38 -0800 Message-Id: <20200121223157.15263-1-sean.j.christopherson@intel.com> X-Mailer: git-send-email 2.24.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-mips-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-mips@vger.kernel.org I'd love to get this into 5.6 if possible. The rebase to kvm/queue only had a single superficial conflict with 668effb63de8 ("KVM: Fix some wrong function names in comment"), and s390 (Christian) and arm64 (Marc) both got smoke tested in v4. Thanks! 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 *** v1 cover letter *** 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/19 and 18/19. 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. The only functional change in v4 is the addition of an x86-specific bug fix in x86's handling of KVM_MR_MOVE. The bug fix is not directly related to dynamically allocating memslots, but it has subtle and hidden conflicts with the cleanup patches, and the fix is higher priority than anything else in the series, i.e. should be merged first. On non-x86 architectures, v3 and v4 should be functionally equivalent, the only non-x86 change in v4 is the dropping of a "const" in kvm_arch_commit_memory_region(). Sean Christopherson (19): 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 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/page_track.c | 15 +- arch/x86/kvm/x86.c | 114 +--- 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 | 621 ++++++++++++------ 22 files changed, 734 insertions(+), 535 deletions(-) create mode 100644 tools/testing/selftests/kvm/x86_64/set_memory_region_test.c -- 2.24.1