Message ID | 1460017232-17429-3-git-send-email-Suravee.Suthikulpanit@amd.com |
---|---|
State | New |
Headers | show |
Radim, On 04/12/2016 03:49 AM, Radim Krčmář wrote: > 2016-04-07 03:20-0500, Suravee Suthikulpanit: >> Adding function pointers in struct kvm_x86_ops for processor-specific >> layer to provide hooks for when KVM initialize and un-initialize VM. >> >> Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com> >> --- >> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c >> @@ -7781,6 +7784,9 @@ static void kvm_free_vcpus(struct kvm *kvm) >> kvm_for_each_vcpu(i, vcpu, kvm) >> kvm_arch_vcpu_free(vcpu); >> >> + if (kvm_x86_ops->vm_uninit) >> + kvm_x86_ops->vm_uninit(kvm); > > vm_uninit() doesn't seem to have much to do with kvm_free_vcpus(), > please call it from kvm_arch_destroy_vm(). > > (kvm_x86_ops.vm_destroy would be a better name then.) > Okay. I'll rename this and move the hook to be called from kvm_arch_destroy_vm(). Thanks, Suravee
Paolo, On 04/12/2016 04:55 PM, Paolo Bonzini wrote: > > > On 11/04/2016 22:49, Radim Krčmář wrote: >>>> @@ -7781,6 +7784,9 @@ static void kvm_free_vcpus(struct kvm *kvm) >>>> kvm_for_each_vcpu(i, vcpu, kvm) >>>> kvm_arch_vcpu_free(vcpu); >>>> >>>> + if (kvm_x86_ops->vm_uninit) >>>> + kvm_x86_ops->vm_uninit(kvm); >> vm_uninit() doesn't seem to have much to do with kvm_free_vcpus(), >> please call it from kvm_arch_destroy_vm(). >> >> (kvm_x86_ops.vm_destroy would be a better name then.) > > Especially, you're calling it with struct kvm full of dangling pointer, > so please call it early, right after the "if (current->mm == kvm->mm)" > block. > > Paolo Good point. Thanks, Suravee
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index f62a9f37..22bd70c 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -848,6 +848,9 @@ struct kvm_x86_ops { bool (*cpu_has_high_real_mode_segbase)(void); void (*cpuid_update)(struct kvm_vcpu *vcpu); + int (*vm_init)(struct kvm *kvm); + void (*vm_uninit)(struct kvm *kvm); + /* Create, but do not attach this VCPU */ struct kvm_vcpu *(*vcpu_create)(struct kvm *kvm, unsigned id); void (*vcpu_free)(struct kvm_vcpu *vcpu); diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 742d0f7..d12583e 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -7754,6 +7754,9 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type) kvm_page_track_init(kvm); kvm_mmu_init_vm(kvm); + if (kvm_x86_ops->vm_init) + return kvm_x86_ops->vm_init(kvm); + return 0; } @@ -7781,6 +7784,9 @@ static void kvm_free_vcpus(struct kvm *kvm) kvm_for_each_vcpu(i, vcpu, kvm) kvm_arch_vcpu_free(vcpu); + if (kvm_x86_ops->vm_uninit) + kvm_x86_ops->vm_uninit(kvm); + mutex_lock(&kvm->lock); for (i = 0; i < atomic_read(&kvm->online_vcpus); i++) kvm->vcpus[i] = NULL;
Adding function pointers in struct kvm_x86_ops for processor-specific layer to provide hooks for when KVM initialize and un-initialize VM. Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com> --- arch/x86/include/asm/kvm_host.h | 3 +++ arch/x86/kvm/x86.c | 6 ++++++ 2 files changed, 9 insertions(+) -- 1.9.1