Skip to content

Commit a53dc16

Browse files
willdeacongregkh
authored andcommitted
KVM: Pass MMU notifier range flags to kvm_unmap_hva_range()
commit fdfe7cb upstream. 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]> [will: Backport to 4.19; use 'blockable' instead of non-existent range flags] Signed-off-by: Will Deacon <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 903c6bd commit a53dc16

File tree

11 files changed

+17
-11
lines changed

11 files changed

+17
-11
lines changed

arch/arm/include/asm/kvm_host.h

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

235235
#define KVM_ARCH_WANT_MMU_NOTIFIER
236236
int kvm_unmap_hva_range(struct kvm *kvm,
237-
unsigned long start, unsigned long end);
237+
unsigned long start, unsigned long end, bool blockable);
238238
void kvm_set_spte_hva(struct kvm *kvm, unsigned long hva, pte_t pte);
239239

240240
unsigned long kvm_arm_num_regs(struct kvm_vcpu *vcpu);

arch/arm64/include/asm/kvm_host.h

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

371371
#define KVM_ARCH_WANT_MMU_NOTIFIER
372372
int kvm_unmap_hva_range(struct kvm *kvm,
373-
unsigned long start, unsigned long end);
373+
unsigned long start, unsigned long end, bool blockable);
374374
void kvm_set_spte_hva(struct kvm *kvm, unsigned long hva, pte_t pte);
375375
int kvm_age_hva(struct kvm *kvm, unsigned long start, unsigned long end);
376376
int kvm_test_age_hva(struct kvm *kvm, unsigned long hva);

arch/mips/include/asm/kvm_host.h

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

937937
#define KVM_ARCH_WANT_MMU_NOTIFIER
938938
int kvm_unmap_hva_range(struct kvm *kvm,
939-
unsigned long start, unsigned long end);
939+
unsigned long start, unsigned long end, bool blockable);
940940
void kvm_set_spte_hva(struct kvm *kvm, unsigned long hva, pte_t pte);
941941
int kvm_age_hva(struct kvm *kvm, unsigned long start, unsigned long end);
942942
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
@@ -512,7 +512,8 @@ static int kvm_unmap_hva_handler(struct kvm *kvm, gfn_t gfn, gfn_t gfn_end,
512512
return 1;
513513
}
514514

515-
int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end)
515+
int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end,
516+
bool blockable)
516517
{
517518
handle_hva_to_gpa(kvm, start, end, &kvm_unmap_hva_handler, NULL);
518519

arch/powerpc/include/asm/kvm_host.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@
6868
#define KVM_ARCH_WANT_MMU_NOTIFIER
6969

7070
extern int kvm_unmap_hva_range(struct kvm *kvm,
71-
unsigned long start, unsigned long end);
71+
unsigned long start, unsigned long end,
72+
bool blockable);
7273
extern int kvm_age_hva(struct kvm *kvm, unsigned long start, unsigned long end);
7374
extern int kvm_test_age_hva(struct kvm *kvm, unsigned long hva);
7475
extern void 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
@@ -812,7 +812,8 @@ void kvmppc_core_commit_memory_region(struct kvm *kvm,
812812
kvm->arch.kvm_ops->commit_memory_region(kvm, mem, old, new);
813813
}
814814

815-
int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end)
815+
int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end,
816+
bool blockable)
816817
{
817818
return kvm->arch.kvm_ops->unmap_hva_range(kvm, start, end);
818819
}

arch/powerpc/kvm/e500_mmu_host.c

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

740-
int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end)
740+
int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end,
741+
bool blockable)
741742
{
742743
/* kvm_unmap_hva flushes everything anyways */
743744
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
@@ -1465,7 +1465,8 @@ asmlinkage void __noreturn kvm_spurious_fault(void);
14651465
____kvm_handle_fault_on_reboot(insn, "")
14661466

14671467
#define KVM_ARCH_WANT_MMU_NOTIFIER
1468-
int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end);
1468+
int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end,
1469+
bool blockable);
14691470
int kvm_age_hva(struct kvm *kvm, unsigned long start, unsigned long end);
14701471
int kvm_test_age_hva(struct kvm *kvm, unsigned long hva);
14711472
void kvm_set_spte_hva(struct kvm *kvm, unsigned long hva, pte_t pte);

arch/x86/kvm/mmu.c

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

1959-
int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end)
1959+
int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end,
1960+
bool blockable)
19601961
{
19611962
return kvm_handle_hva_range(kvm, start, end, 0, kvm_unmap_rmapp);
19621963
}

virt/kvm/arm/mmu.c

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

18271827
int kvm_unmap_hva_range(struct kvm *kvm,
1828-
unsigned long start, unsigned long end)
1828+
unsigned long start, unsigned long end, bool blockable)
18291829
{
18301830
if (!kvm->arch.pgd)
18311831
return 0;

0 commit comments

Comments
 (0)