Re: [PATCH v4 00/19] KVM: Dynamically size memslot arrays

2019-12-18 Thread Marc Zyngier

On 2019-12-17 20:40, Sean Christopherson wrote:
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().


Gave it another go on top of 5.5-rc2 on an arm64 box, and nothing
exploded. So thumbs up from me.

Thanks,

   M.
--
Jazz is not dead. It just smells funny...
___
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm


Re: [PATCH v4 00/19] KVM: Dynamically size memslot arrays

2019-12-18 Thread Christian Borntraeger



On 17.12.19 21:40, Sean Christopherson wrote:
> 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().

I gave this series a quick spin and it still seems to work on s390 (minus the 
selftest).

___
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm


[PATCH v4 00/19] KVM: Dynamically size memslot arrays

2019-12-17 Thread Sean Christopherson
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().

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 (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  |   3 +
 .../testing/selftests/kvm/include/kvm_util.h  |   1 +
 tools/testing/selftests/kvm/lib/kvm_util.c|  30 +
 .../selftests/kvm/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, 736 insertions(+), 535 deletions(-)
 create mode 100644 tools/testing/selftests/kvm/set_memory_region_test.c

--