Skip to content

Commit fdfe7cb

Browse files
willdeaconbonzini
authored andcommitted
KVM: Pass MMU notifier range flags to kvm_unmap_hva_range()
The 'flags' field of 'struct mmu_notifier_range' is used to indicate whether invalidate_range_{start,end}() are permitted to block. In the case of kvm_mmu_notifier_invalidate_range_start(), this field is not forwarded on to the architecture-specific implementation of kvm_unmap_hva_range() and therefore the backend cannot sensibly decide whether or not to block. Add an extra 'flags' parameter to kvm_unmap_hva_range() so that architectures are aware as to whether or not they are permitted to block. Cc: <[email protected]> Cc: Marc Zyngier <[email protected]> Cc: Suzuki K Poulose <[email protected]> Cc: James Morse <[email protected]> Signed-off-by: Will Deacon <[email protected]> Message-Id: <[email protected]> Signed-off-by: Paolo Bonzini <[email protected]>
1 parent cb957ad commit fdfe7cb

File tree

10 files changed

+17
-10
lines changed

10 files changed

+17
-10
lines changed

arch/arm64/include/asm/kvm_host.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,7 @@ int __kvm_arm_vcpu_set_events(struct kvm_vcpu *vcpu,
473473

474474
#define KVM_ARCH_WANT_MMU_NOTIFIER
475475
int kvm_unmap_hva_range(struct kvm *kvm,
476-
unsigned long start, unsigned long end);
476+
unsigned long start, unsigned long end, unsigned flags);
477477
int kvm_set_spte_hva(struct kvm *kvm, unsigned long hva, pte_t pte);
478478
int kvm_age_hva(struct kvm *kvm, unsigned long start, unsigned long end);
479479
int kvm_test_age_hva(struct kvm *kvm, unsigned long hva);

arch/arm64/kvm/mmu.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2213,7 +2213,7 @@ static int kvm_unmap_hva_handler(struct kvm *kvm, gpa_t gpa, u64 size, void *dat
22132213
}
22142214

22152215
int kvm_unmap_hva_range(struct kvm *kvm,
2216-
unsigned long start, unsigned long end)
2216+
unsigned long start, unsigned long end, unsigned flags)
22172217
{
22182218
if (!kvm->arch.mmu.pgd)
22192219
return 0;

arch/mips/include/asm/kvm_host.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -969,7 +969,7 @@ enum kvm_mips_fault_result kvm_trap_emul_gva_fault(struct kvm_vcpu *vcpu,
969969

970970
#define KVM_ARCH_WANT_MMU_NOTIFIER
971971
int kvm_unmap_hva_range(struct kvm *kvm,
972-
unsigned long start, unsigned long end);
972+
unsigned long start, unsigned long end, unsigned flags);
973973
int kvm_set_spte_hva(struct kvm *kvm, unsigned long hva, pte_t pte);
974974
int kvm_age_hva(struct kvm *kvm, unsigned long start, unsigned long end);
975975
int kvm_test_age_hva(struct kvm *kvm, unsigned long hva);

arch/mips/kvm/mmu.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -486,7 +486,8 @@ static int kvm_unmap_hva_handler(struct kvm *kvm, gfn_t gfn, gfn_t gfn_end,
486486
return 1;
487487
}
488488

489-
int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end)
489+
int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end,
490+
unsigned flags)
490491
{
491492
handle_hva_to_gpa(kvm, start, end, &kvm_unmap_hva_handler, NULL);
492493

arch/powerpc/include/asm/kvm_host.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@
5858
#define KVM_ARCH_WANT_MMU_NOTIFIER
5959

6060
extern int kvm_unmap_hva_range(struct kvm *kvm,
61-
unsigned long start, unsigned long end);
61+
unsigned long start, unsigned long end,
62+
unsigned flags);
6263
extern int kvm_age_hva(struct kvm *kvm, unsigned long start, unsigned long end);
6364
extern int kvm_test_age_hva(struct kvm *kvm, unsigned long hva);
6465
extern int kvm_set_spte_hva(struct kvm *kvm, unsigned long hva, pte_t pte);

arch/powerpc/kvm/book3s.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -834,7 +834,8 @@ void kvmppc_core_commit_memory_region(struct kvm *kvm,
834834
kvm->arch.kvm_ops->commit_memory_region(kvm, mem, old, new, change);
835835
}
836836

837-
int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end)
837+
int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end,
838+
unsigned flags)
838839
{
839840
return kvm->arch.kvm_ops->unmap_hva_range(kvm, start, end);
840841
}

arch/powerpc/kvm/e500_mmu_host.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -734,7 +734,8 @@ static int kvm_unmap_hva(struct kvm *kvm, unsigned long hva)
734734
return 0;
735735
}
736736

737-
int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end)
737+
int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end,
738+
unsigned flags)
738739
{
739740
/* kvm_unmap_hva flushes everything anyways */
740741
kvm_unmap_hva(kvm, start);

arch/x86/include/asm/kvm_host.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1596,7 +1596,8 @@ asmlinkage void kvm_spurious_fault(void);
15961596
_ASM_EXTABLE(666b, 667b)
15971597

15981598
#define KVM_ARCH_WANT_MMU_NOTIFIER
1599-
int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end);
1599+
int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end,
1600+
unsigned flags);
16001601
int kvm_age_hva(struct kvm *kvm, unsigned long start, unsigned long end);
16011602
int kvm_test_age_hva(struct kvm *kvm, unsigned long hva);
16021603
int kvm_set_spte_hva(struct kvm *kvm, unsigned long hva, pte_t pte);

arch/x86/kvm/mmu/mmu.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1916,7 +1916,8 @@ static int kvm_handle_hva(struct kvm *kvm, unsigned long hva,
19161916
return kvm_handle_hva_range(kvm, hva, hva + 1, data, handler);
19171917
}
19181918

1919-
int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end)
1919+
int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end,
1920+
unsigned flags)
19201921
{
19211922
return kvm_handle_hva_range(kvm, start, end, 0, kvm_unmap_rmapp);
19221923
}

virt/kvm/kvm_main.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -482,7 +482,8 @@ static int kvm_mmu_notifier_invalidate_range_start(struct mmu_notifier *mn,
482482
* count is also read inside the mmu_lock critical section.
483483
*/
484484
kvm->mmu_notifier_count++;
485-
need_tlb_flush = kvm_unmap_hva_range(kvm, range->start, range->end);
485+
need_tlb_flush = kvm_unmap_hva_range(kvm, range->start, range->end,
486+
range->flags);
486487
need_tlb_flush |= kvm->tlbs_dirty;
487488
/* we've to flush the tlb before the pages can be freed */
488489
if (need_tlb_flush)

0 commit comments

Comments
 (0)