Merge branch kvm-arm64/parallel-faults into kvmarm-master/next
authorMarc Zyngier <maz@kernel.org>
Mon, 5 Dec 2022 14:22:55 +0000 (14:22 +0000)
committerMarc Zyngier <maz@kernel.org>
Mon, 5 Dec 2022 14:22:55 +0000 (14:22 +0000)
* kvm-arm64/parallel-faults:
  : .
  : Parallel stage-2 fault handling, courtesy of Oliver Upton.
  : From the cover letter:
  :
  : "Presently KVM only takes a read lock for stage 2 faults if it believes
  : the fault can be fixed by relaxing permissions on a PTE (write unprotect
  : for dirty logging). Otherwise, stage 2 faults grab the write lock, which
  : predictably can pile up all the vCPUs in a sufficiently large VM.
  :
  : Like the TDP MMU for x86, this series loosens the locking around
  : manipulations of the stage 2 page tables to allow parallel faults. RCU
  : and atomics are exploited to safely build/destroy the stage 2 page
  : tables in light of multiple software observers."
  : .
  KVM: arm64: Reject shared table walks in the hyp code
  KVM: arm64: Don't acquire RCU read lock for exclusive table walks
  KVM: arm64: Take a pointer to walker data in kvm_dereference_pteref()
  KVM: arm64: Handle stage-2 faults in parallel
  KVM: arm64: Make table->block changes parallel-aware
  KVM: arm64: Make leaf->leaf PTE changes parallel-aware
  KVM: arm64: Make block->table PTE changes parallel-aware
  KVM: arm64: Split init and set for table PTE
  KVM: arm64: Atomically update stage 2 leaf attributes in parallel walks
  KVM: arm64: Protect stage-2 traversal with RCU
  KVM: arm64: Tear down unlinked stage-2 subtree after break-before-make
  KVM: arm64: Use an opaque type for pteps
  KVM: arm64: Add a helper to tear down unlinked stage-2 subtrees
  KVM: arm64: Don't pass kvm_pgtable through kvm_pgtable_walk_data
  KVM: arm64: Pass mm_ops through the visitor context
  KVM: arm64: Stash observed pte value in visitor context
  KVM: arm64: Combine visitor arguments into a context structure

Signed-off-by: Marc Zyngier <maz@kernel.org>
1  2 
arch/arm64/kvm/hyp/nvhe/mem_protect.c
arch/arm64/kvm/mmu.c

Simple merge
@@@ -640,8 -659,8 +659,8 @@@ static struct kvm_pgtable_mm_ops kvm_us
  static int get_user_mapping_size(struct kvm *kvm, u64 addr)
  {
        struct kvm_pgtable pgt = {
-               .pgd            = (kvm_pte_t *)kvm->mm->pgd,
+               .pgd            = (kvm_pteref_t)kvm->mm->pgd,
 -              .ia_bits        = VA_BITS,
 +              .ia_bits        = vabits_actual,
                .start_level    = (KVM_PGTABLE_MAX_LEVELS -
                                   CONFIG_PGTABLE_LEVELS),
                .mm_ops         = &kvm_user_mm_ops,