From: Sean Christopherson <sean.j.christopherson@intel.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: "Paul Mackerras" <paulus@ozlabs.org>,
"Christian Borntraeger" <borntraeger@de.ibm.com>,
"Janosch Frank" <frankja@linux.ibm.com>,
"David Hildenbrand" <david@redhat.com>,
"Cornelia Huck" <cohuck@redhat.com>,
"Sean Christopherson" <sean.j.christopherson@intel.com>,
"Vitaly Kuznetsov" <vkuznets@redhat.com>,
"Wanpeng Li" <wanpengli@tencent.com>,
"Jim Mattson" <jmattson@google.com>,
"Joerg Roedel" <joro@8bytes.org>, "Marc Zyngier" <maz@kernel.org>,
"James Morse" <james.morse@arm.com>,
"Julien Thierry" <julien.thierry.kdev@gmail.com>,
"Suzuki K Poulose" <suzuki.poulose@arm.com>,
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" <christoffer.dall@arm.com>,
"Peter Xu" <peterx@redhat.com>,
"Philippe Mathieu-Daudé" <f4bug@amsat.org>
Subject: [PATCH v6 00/22] KVM: Dynamically size memslot arrays
Date: Tue, 18 Feb 2020 13:07:14 -0800 [thread overview]
Message-ID: <20200218210736.16432-1-sean.j.christopherson@intel.com> (raw)
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
--
2.24.1
next reply other threads:[~2020-02-18 21:07 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-02-18 21:07 Sean Christopherson [this message]
2020-02-18 21:07 ` [PATCH v6 01/22] KVM: x86: Allocate new rmap and large page tracking when moving memslot Sean Christopherson
2020-02-19 19:10 ` Peter Xu
2020-02-18 21:07 ` [PATCH v6 02/22] KVM: Reinstall old memslots if arch preparation fails Sean Christopherson
2020-02-18 21:07 ` [PATCH v6 03/22] KVM: Don't free new memslot if allocation of said memslot fails Sean Christopherson
2020-02-18 21:07 ` [PATCH v6 04/22] KVM: PPC: Move memslot memory allocation into prepare_memory_region() Sean Christopherson
2020-02-18 21:07 ` [PATCH v6 05/22] KVM: x86: Allocate memslot resources during prepare_memory_region() Sean Christopherson
2020-02-18 21:07 ` [PATCH v6 06/22] KVM: Drop kvm_arch_create_memslot() Sean Christopherson
2020-02-18 21:07 ` [PATCH v6 07/22] KVM: Explicitly free allocated-but-unused dirty bitmap Sean Christopherson
2020-02-18 21:07 ` [PATCH v6 08/22] KVM: Refactor error handling for setting memory region Sean Christopherson
2020-02-18 21:07 ` [PATCH v6 09/22] KVM: Move setting of memslot into helper routine Sean Christopherson
2020-02-18 21:07 ` [PATCH v6 10/22] KVM: Drop "const" attribute from old memslot in commit_memory_region() Sean Christopherson
2020-02-18 21:07 ` [PATCH v6 11/22] KVM: x86: Free arrays for old memslot when moving memslot's base gfn Sean Christopherson
2020-02-18 21:07 ` [PATCH v6 12/22] KVM: Move memslot deletion to helper function Sean Christopherson
2020-02-18 21:07 ` [PATCH v6 13/22] KVM: Simplify kvm_free_memslot() and all its descendents Sean Christopherson
2020-02-18 21:07 ` [PATCH v6 14/22] KVM: Clean up local variable usage in __kvm_set_memory_region() Sean Christopherson
2020-02-21 17:43 ` Paolo Bonzini
2020-02-18 21:07 ` [PATCH v6 15/22] KVM: Provide common implementation for generic dirty log functions Sean Christopherson
2020-02-18 21:07 ` [PATCH v6 16/22] KVM: Ensure validity of memslot with respect to kvm_get_dirty_log() Sean Christopherson
2020-02-18 21:07 ` [PATCH v6 17/22] KVM: Terminate memslot walks via used_slots Sean Christopherson
2020-02-21 17:47 ` Paolo Bonzini
2020-02-18 21:07 ` [PATCH v6 18/22] KVM: Dynamically size memslot array based on number of used slots Sean Christopherson
2020-02-18 21:07 ` [PATCH v6 19/22] KVM: selftests: Add test for KVM_SET_USER_MEMORY_REGION Sean Christopherson
2020-02-18 21:07 ` [PATCH v6 20/22] KVM: x86/mmu: Move kvm_arch_flush_remote_tlbs_memslot() to mmu.c Sean Christopherson
2020-02-18 21:07 ` [PATCH v6 21/22] KVM: x86/mmu: Use ranged-based TLB flush for dirty log memslot flush Sean Christopherson
2020-02-19 9:22 ` Sergei Shtylyov
2020-02-19 15:18 ` Sean Christopherson
2020-02-18 21:07 ` [PATCH v6 22/22] KVM: x86/mmu: Consolidate open coded variants of memslot TLB flushes Sean Christopherson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200218210736.16432-1-sean.j.christopherson@intel.com \
--to=sean.j.christopherson@intel.com \
--cc=borntraeger@de.ibm.com \
--cc=christoffer.dall@arm.com \
--cc=cohuck@redhat.com \
--cc=david@redhat.com \
--cc=f4bug@amsat.org \
--cc=frankja@linux.ibm.com \
--cc=james.morse@arm.com \
--cc=jmattson@google.com \
--cc=joro@8bytes.org \
--cc=julien.thierry.kdev@gmail.com \
--cc=kvm-ppc@vger.kernel.org \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mips@vger.kernel.org \
--cc=maz@kernel.org \
--cc=paulus@ozlabs.org \
--cc=pbonzini@redhat.com \
--cc=peterx@redhat.com \
--cc=suzuki.poulose@arm.com \
--cc=vkuznets@redhat.com \
--cc=wanpengli@tencent.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).