Sean Christopherson <[email protected]> writes: > Flush/zap every memslot in kvm_arch_flush_shadow_all(), i.e. when the > owning userspace process is exiting, as KVM must ensure all associated > memory is unmapped from the guest. >
That's true and yes, this looks like a miss. I guess it must have gone unnoticed because after the owning process exits, and when the vmfd is closed it will issue a teardown. So the escape is only until the vmfd is closed... kvm_arch_destroy_vm() -> kvmppc_free_radix() The change looks good to me. I have only tested this on my qemu+dev setup for now. But will give it a try on real hardware as well. Thanks for taking care of this. Please feel free to add: Reviewed-by: Ritesh Harjani (IBM) <[email protected]> > Cc: [email protected] > Signed-off-by: Sean Christopherson <[email protected]> > --- > arch/powerpc/include/asm/kvm_host.h | 1 - > arch/powerpc/kvm/powerpc.c | 11 +++++++++++ > 2 files changed, 11 insertions(+), 1 deletion(-) > > diff --git a/arch/powerpc/include/asm/kvm_host.h > b/arch/powerpc/include/asm/kvm_host.h > index 708a32f89776..50a42f80e5f1 100644 > --- a/arch/powerpc/include/asm/kvm_host.h > +++ b/arch/powerpc/include/asm/kvm_host.h > @@ -910,7 +910,6 @@ struct kvm_vcpu_arch { > #define __KVM_HAVE_CREATE_DEVICE > > static inline void kvm_arch_memslots_updated(struct kvm *kvm, u64 gen) {} > -static inline void kvm_arch_flush_shadow_all(struct kvm *kvm) {} > static inline void kvm_arch_vcpu_blocking(struct kvm_vcpu *vcpu) {} > static inline void kvm_arch_vcpu_unblocking(struct kvm_vcpu *vcpu) {} > > diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c > index 9194cf492d1c..9e9d0865c2f6 100644 > --- a/arch/powerpc/kvm/powerpc.c > +++ b/arch/powerpc/kvm/powerpc.c > @@ -764,6 +764,17 @@ void kvm_arch_commit_memory_region(struct kvm *kvm, > kvmppc_core_commit_memory_region(kvm, old, new, change); > } > > +void kvm_arch_flush_shadow_all(struct kvm *kvm) > +{ > + struct kvm_memory_slot *slot; > + struct kvm_memslots *slots; > + int bkt; > + > + slots = kvm_memslots(kvm); > + kvm_for_each_memslot(slot, bkt, slots) > + kvmppc_core_flush_memslot(kvm, slot); > +} > + > void kvm_arch_flush_shadow_memslot(struct kvm *kvm, > struct kvm_memory_slot *slot) > { > -- > 2.56.0.385.gac671c819a-goog
