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: stable@vger.kernel.org Cc: Marc Zyngier maz@kernel.org Cc: Suzuki K Poulose suzuki.poulose@arm.com Cc: James Morse james.morse@arm.com Signed-off-by: Will Deacon will@kernel.org --- arch/arm64/include/asm/kvm_host.h | 2 +- arch/arm64/kvm/mmu.c | 2 +- arch/mips/include/asm/kvm_host.h | 2 +- arch/mips/kvm/mmu.c | 3 ++- arch/powerpc/include/asm/kvm_host.h | 3 ++- arch/powerpc/kvm/book3s.c | 3 ++- arch/powerpc/kvm/e500_mmu_host.c | 3 ++- arch/x86/include/asm/kvm_host.h | 3 ++- arch/x86/kvm/mmu/mmu.c | 3 ++- virt/kvm/kvm_main.c | 3 ++- 10 files changed, 17 insertions(+), 10 deletions(-)
diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h index e21d4a01372f..759d62343e1d 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -443,7 +443,7 @@ int __kvm_arm_vcpu_set_events(struct kvm_vcpu *vcpu,
#define KVM_ARCH_WANT_MMU_NOTIFIER int kvm_unmap_hva_range(struct kvm *kvm, - unsigned long start, unsigned long end); + unsigned long start, unsigned long end, unsigned flags); int kvm_set_spte_hva(struct kvm *kvm, unsigned long hva, pte_t pte); int kvm_age_hva(struct kvm *kvm, unsigned long start, unsigned long end); int kvm_test_age_hva(struct kvm *kvm, unsigned long hva); diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c index 31058e6e7c2a..5f6b35c33618 100644 --- a/arch/arm64/kvm/mmu.c +++ b/arch/arm64/kvm/mmu.c @@ -2203,7 +2203,7 @@ static int kvm_unmap_hva_handler(struct kvm *kvm, gpa_t gpa, u64 size, void *dat }
int kvm_unmap_hva_range(struct kvm *kvm, - unsigned long start, unsigned long end) + unsigned long start, unsigned long end, unsigned flags) { if (!kvm->arch.pgd) return 0; diff --git a/arch/mips/include/asm/kvm_host.h b/arch/mips/include/asm/kvm_host.h index 363e7a89d173..ef1d25d49ec8 100644 --- a/arch/mips/include/asm/kvm_host.h +++ b/arch/mips/include/asm/kvm_host.h @@ -981,7 +981,7 @@ enum kvm_mips_fault_result kvm_trap_emul_gva_fault(struct kvm_vcpu *vcpu,
#define KVM_ARCH_WANT_MMU_NOTIFIER int kvm_unmap_hva_range(struct kvm *kvm, - unsigned long start, unsigned long end); + unsigned long start, unsigned long end, unsigned flags); int kvm_set_spte_hva(struct kvm *kvm, unsigned long hva, pte_t pte); int kvm_age_hva(struct kvm *kvm, unsigned long start, unsigned long end); int kvm_test_age_hva(struct kvm *kvm, unsigned long hva); diff --git a/arch/mips/kvm/mmu.c b/arch/mips/kvm/mmu.c index 49bd160f4d85..0783ac9b3240 100644 --- a/arch/mips/kvm/mmu.c +++ b/arch/mips/kvm/mmu.c @@ -518,7 +518,8 @@ static int kvm_unmap_hva_handler(struct kvm *kvm, gfn_t gfn, gfn_t gfn_end, return 1; }
-int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end) +int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end, + unsigned flags) { handle_hva_to_gpa(kvm, start, end, &kvm_unmap_hva_handler, NULL);
diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h index 7e2d061d0445..bccf0ba2da2e 100644 --- a/arch/powerpc/include/asm/kvm_host.h +++ b/arch/powerpc/include/asm/kvm_host.h @@ -58,7 +58,8 @@ #define KVM_ARCH_WANT_MMU_NOTIFIER
extern int kvm_unmap_hva_range(struct kvm *kvm, - unsigned long start, unsigned long end); + unsigned long start, unsigned long end, + unsigned flags); extern int kvm_age_hva(struct kvm *kvm, unsigned long start, unsigned long end); extern int kvm_test_age_hva(struct kvm *kvm, unsigned long hva); extern int kvm_set_spte_hva(struct kvm *kvm, unsigned long hva, pte_t pte); diff --git a/arch/powerpc/kvm/book3s.c b/arch/powerpc/kvm/book3s.c index 41fedec69ac3..49db50d1db04 100644 --- a/arch/powerpc/kvm/book3s.c +++ b/arch/powerpc/kvm/book3s.c @@ -834,7 +834,8 @@ void kvmppc_core_commit_memory_region(struct kvm *kvm, kvm->arch.kvm_ops->commit_memory_region(kvm, mem, old, new, change); }
-int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end) +int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end, + unsigned flags) { return kvm->arch.kvm_ops->unmap_hva_range(kvm, start, end); } diff --git a/arch/powerpc/kvm/e500_mmu_host.c b/arch/powerpc/kvm/e500_mmu_host.c index d6c1069e9954..ed0c9c43d0cf 100644 --- a/arch/powerpc/kvm/e500_mmu_host.c +++ b/arch/powerpc/kvm/e500_mmu_host.c @@ -734,7 +734,8 @@ static int kvm_unmap_hva(struct kvm *kvm, unsigned long hva) return 0; }
-int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end) +int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end, + unsigned flags) { /* kvm_unmap_hva flushes everything anyways */ kvm_unmap_hva(kvm, start); diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index be5363b21540..c6908a3d551e 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1641,7 +1641,8 @@ asmlinkage void kvm_spurious_fault(void); _ASM_EXTABLE(666b, 667b)
#define KVM_ARCH_WANT_MMU_NOTIFIER -int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end); +int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end, + unsigned flags); int kvm_age_hva(struct kvm *kvm, unsigned long start, unsigned long end); int kvm_test_age_hva(struct kvm *kvm, unsigned long hva); int kvm_set_spte_hva(struct kvm *kvm, unsigned long hva, pte_t pte); diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c index 6d6a0ae7800c..9516a958e780 100644 --- a/arch/x86/kvm/mmu/mmu.c +++ b/arch/x86/kvm/mmu/mmu.c @@ -1971,7 +1971,8 @@ static int kvm_handle_hva(struct kvm *kvm, unsigned long hva, return kvm_handle_hva_range(kvm, hva, hva + 1, data, handler); }
-int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end) +int kvm_unmap_hva_range(struct kvm *kvm, unsigned long start, unsigned long end, + unsigned flags) { return kvm_handle_hva_range(kvm, start, end, 0, kvm_unmap_rmapp); } diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 0a68c9d3d3ab..9e925675a886 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -427,7 +427,8 @@ static int kvm_mmu_notifier_invalidate_range_start(struct mmu_notifier *mn, * count is also read inside the mmu_lock critical section. */ kvm->mmu_notifier_count++; - need_tlb_flush = kvm_unmap_hva_range(kvm, range->start, range->end); + need_tlb_flush = kvm_unmap_hva_range(kvm, range->start, range->end, + range->flags); need_tlb_flush |= kvm->tlbs_dirty; /* we've to flush the tlb before the pages can be freed */ if (need_tlb_flush)
Hi
[This is an automated email]
This commit has been processed because it contains a -stable tag. The stable tag indicates that it's relevant for the following trees: all
The bot has tested the following trees: v5.8.1, v5.7.15, v5.4.58, v4.19.139, v4.14.193, v4.9.232, v4.4.232.
v5.8.1: Build OK! v5.7.15: Build OK! v5.4.58: Build OK! v4.19.139: Failed to apply! Possible dependencies: 18fc7bf8e041 ("arm64: KVM: Allow for direct call of HYP functions when using VHE") 208243c752a7 ("KVM: arm64: Move hyp-init.S to nVHE") 25357de01b95 ("KVM: arm64: Clean up kvm makefiles") 33e45234987e ("arm64: initialize and switch ptrauth kernel keys") 396244692232 ("arm64: preempt: Provide our own implementation of asm/preempt.h") 3f58bf634555 ("KVM: arm/arm64: Share common code in user_mem_abort()") 6396b852e46e ("KVM: arm/arm64: Re-factor setting the Stage 2 entry to exec on fault") 748c0e312fce ("KVM: Make kvm_set_spte_hva() return int") 750319756256 ("arm64: add basic pointer authentication support") 7621712918ad ("KVM: arm64: Add build rules for separate VHE/nVHE object files") 7aa8d1464165 ("arm/arm64: KVM: Introduce kvm_call_hyp_ret()") 86d0dd34eaff ("arm64: cpufeature: add feature for CRC32 instructions") 90776dd1c427 ("arm64/efi: Move variable assignments after SECTIONS") 95b861a4a6d9 ("arm64: arch_timer: Add workaround for ARM erratum 1188873") a0e50aa3f4a8 ("KVM: arm64: Factor out stage 2 page table data from struct kvm") b877e9849d41 ("KVM: arm64: Build hyp-entry.S separately for VHE/nVHE") bd4fb6d270bc ("arm64: Add support for SB barrier and patch in over DSB; ISB sequences") be1298425665 ("arm64: install user ptrauth keys at kernel exit time") d82755b2e781 ("KVM: arm64: Kill off CONFIG_KVM_ARM_HOST") f50b6f6ae131 ("KVM: arm64: Handle calls to prefixed hyp functions") f56063c51f9f ("arm64: add image head flag definitions") f8df73388ee2 ("KVM: arm/arm64: Introduce helpers to manipulate page table entries")
v4.14.193: Failed to apply! Possible dependencies: 0db9dd8a0fbd ("KVM: arm/arm64: Stop using the kernel's {pmd,pud,pgd}_populate helpers") 17ab9d57deba ("KVM: arm/arm64: Drop vcpu parameter from guest cache maintenance operartions") 3f58bf634555 ("KVM: arm/arm64: Share common code in user_mem_abort()") 6396b852e46e ("KVM: arm/arm64: Re-factor setting the Stage 2 entry to exec on fault") 694556d54f35 ("KVM: arm/arm64: Clean dcache to PoC when changing PTE due to CoW") 748c0e312fce ("KVM: Make kvm_set_spte_hva() return int") 88dc25e8ea7c ("KVM: arm/arm64: Consolidate page-table accessors") 91c703e0382a ("arm: KVM: Add optimized PIPT icache flushing") a15f693935a9 ("KVM: arm/arm64: Split dcache/icache flushing") a9c0e12ebee5 ("KVM: arm/arm64: Only clean the dcache on translation fault") d0e22b4ac3ba ("KVM: arm/arm64: Limit icache invalidation to prefetch aborts") f8df73388ee2 ("KVM: arm/arm64: Introduce helpers to manipulate page table entries")
v4.9.232: Failed to apply! Possible dependencies: 1534b3964901 ("KVM: MIPS/MMU: Simplify ASID restoration") 1581ff3dbf69 ("KVM: MIPS/MMU: Move preempt/ASID handling to implementation") 1880afd6057f ("KVM: MIPS/T&E: Add lockless GVA access helpers") 411740f5422a ("KVM: MIPS/MMU: Implement KVM_CAP_SYNC_MMU") 748c0e312fce ("KVM: Make kvm_set_spte_hva() return int") 91cdee5710d5 ("KVM: MIPS/T&E: Restore host asid on return to host") a2c046e40ff1 ("KVM: MIPS: Add vcpu_run() & vcpu_reenter() callbacks") a31b50d741bd ("KVM: MIPS/MMU: Invalidate GVA PTs on ASID changes") a60b8438bdba ("KVM: MIPS: Convert get/set_regs -> vcpu_load/put") a7ebb2e410f8 ("KVM: MIPS/T&E: active_mm = init_mm in guest context") aba8592950f1 ("KVM: MIPS/MMU: Invalidate stale GVA PTEs on TLBW") c550d53934d8 ("KVM: MIPS: Remove duplicated ASIDs from vcpu")
v4.4.232: Failed to apply! Possible dependencies: 16d100db245a ("MIPS: Move Cause.ExcCode trap codes to mipsregs.h") 1880afd6057f ("KVM: MIPS/T&E: Add lockless GVA access helpers") 19d194c62b25 ("MIPS: KVM: Simplify TLB_* macros") 411740f5422a ("KVM: MIPS/MMU: Implement KVM_CAP_SYNC_MMU") 748c0e312fce ("KVM: Make kvm_set_spte_hva() return int") 8cffd1974851 ("MIPS: KVM: Convert code to kernel sized types") 9fbfb06a4065 ("MIPS: KVM: Arrayify struct kvm_mips_tlb::tlb_lo*") ba049e93aef7 ("kvm: rename pfn_t to kvm_pfn_t") bdb7ed8608f8 ("MIPS: KVM: Convert headers to kernel sized types") ca64c2beecd4 ("MIPS: KVM: Abstract guest ASID mask") caa1faa7aba6 ("MIPS: KVM: Trivial whitespace and style fixes")
NOTE: The patch will not be queued to stable trees until it is upstream.
How should we proceed with this patch?
Hi
[This is an automated email]
This commit has been processed because it contains a -stable tag. The stable tag indicates that it's relevant for the following trees: all
The bot has tested the following trees: v5.8.2, v5.7.16, v5.4.59, v4.19.140, v4.14.193, v4.9.232, v4.4.232.
v5.8.2: Build OK! v5.7.16: Build OK! v5.4.59: Build OK! v4.19.140: Failed to apply! Possible dependencies: 18fc7bf8e041 ("arm64: KVM: Allow for direct call of HYP functions when using VHE") 208243c752a7 ("KVM: arm64: Move hyp-init.S to nVHE") 25357de01b95 ("KVM: arm64: Clean up kvm makefiles") 33e45234987e ("arm64: initialize and switch ptrauth kernel keys") 396244692232 ("arm64: preempt: Provide our own implementation of asm/preempt.h") 3f58bf634555 ("KVM: arm/arm64: Share common code in user_mem_abort()") 6396b852e46e ("KVM: arm/arm64: Re-factor setting the Stage 2 entry to exec on fault") 748c0e312fce ("KVM: Make kvm_set_spte_hva() return int") 750319756256 ("arm64: add basic pointer authentication support") 7621712918ad ("KVM: arm64: Add build rules for separate VHE/nVHE object files") 7aa8d1464165 ("arm/arm64: KVM: Introduce kvm_call_hyp_ret()") 86d0dd34eaff ("arm64: cpufeature: add feature for CRC32 instructions") 90776dd1c427 ("arm64/efi: Move variable assignments after SECTIONS") 95b861a4a6d9 ("arm64: arch_timer: Add workaround for ARM erratum 1188873") a0e50aa3f4a8 ("KVM: arm64: Factor out stage 2 page table data from struct kvm") b877e9849d41 ("KVM: arm64: Build hyp-entry.S separately for VHE/nVHE") bd4fb6d270bc ("arm64: Add support for SB barrier and patch in over DSB; ISB sequences") be1298425665 ("arm64: install user ptrauth keys at kernel exit time") d82755b2e781 ("KVM: arm64: Kill off CONFIG_KVM_ARM_HOST") f50b6f6ae131 ("KVM: arm64: Handle calls to prefixed hyp functions") f56063c51f9f ("arm64: add image head flag definitions") f8df73388ee2 ("KVM: arm/arm64: Introduce helpers to manipulate page table entries")
v4.14.193: Failed to apply! Possible dependencies: 0db9dd8a0fbd ("KVM: arm/arm64: Stop using the kernel's {pmd,pud,pgd}_populate helpers") 17ab9d57deba ("KVM: arm/arm64: Drop vcpu parameter from guest cache maintenance operartions") 3f58bf634555 ("KVM: arm/arm64: Share common code in user_mem_abort()") 6396b852e46e ("KVM: arm/arm64: Re-factor setting the Stage 2 entry to exec on fault") 694556d54f35 ("KVM: arm/arm64: Clean dcache to PoC when changing PTE due to CoW") 748c0e312fce ("KVM: Make kvm_set_spte_hva() return int") 88dc25e8ea7c ("KVM: arm/arm64: Consolidate page-table accessors") 91c703e0382a ("arm: KVM: Add optimized PIPT icache flushing") a15f693935a9 ("KVM: arm/arm64: Split dcache/icache flushing") a9c0e12ebee5 ("KVM: arm/arm64: Only clean the dcache on translation fault") d0e22b4ac3ba ("KVM: arm/arm64: Limit icache invalidation to prefetch aborts") f8df73388ee2 ("KVM: arm/arm64: Introduce helpers to manipulate page table entries")
v4.9.232: Failed to apply! Possible dependencies: 1534b3964901 ("KVM: MIPS/MMU: Simplify ASID restoration") 1581ff3dbf69 ("KVM: MIPS/MMU: Move preempt/ASID handling to implementation") 1880afd6057f ("KVM: MIPS/T&E: Add lockless GVA access helpers") 411740f5422a ("KVM: MIPS/MMU: Implement KVM_CAP_SYNC_MMU") 748c0e312fce ("KVM: Make kvm_set_spte_hva() return int") 91cdee5710d5 ("KVM: MIPS/T&E: Restore host asid on return to host") a2c046e40ff1 ("KVM: MIPS: Add vcpu_run() & vcpu_reenter() callbacks") a31b50d741bd ("KVM: MIPS/MMU: Invalidate GVA PTs on ASID changes") a60b8438bdba ("KVM: MIPS: Convert get/set_regs -> vcpu_load/put") a7ebb2e410f8 ("KVM: MIPS/T&E: active_mm = init_mm in guest context") aba8592950f1 ("KVM: MIPS/MMU: Invalidate stale GVA PTEs on TLBW") c550d53934d8 ("KVM: MIPS: Remove duplicated ASIDs from vcpu")
v4.4.232: Failed to apply! Possible dependencies: 16d100db245a ("MIPS: Move Cause.ExcCode trap codes to mipsregs.h") 1880afd6057f ("KVM: MIPS/T&E: Add lockless GVA access helpers") 19d194c62b25 ("MIPS: KVM: Simplify TLB_* macros") 411740f5422a ("KVM: MIPS/MMU: Implement KVM_CAP_SYNC_MMU") 748c0e312fce ("KVM: Make kvm_set_spte_hva() return int") 8cffd1974851 ("MIPS: KVM: Convert code to kernel sized types") 9fbfb06a4065 ("MIPS: KVM: Arrayify struct kvm_mips_tlb::tlb_lo*") ba049e93aef7 ("kvm: rename pfn_t to kvm_pfn_t") bdb7ed8608f8 ("MIPS: KVM: Convert headers to kernel sized types") ca64c2beecd4 ("MIPS: KVM: Abstract guest ASID mask") caa1faa7aba6 ("MIPS: KVM: Trivial whitespace and style fixes")
NOTE: The patch will not be queued to stable trees until it is upstream.
How should we proceed with this patch?
linux-stable-mirror@lists.linaro.org