3 files changed, 43 insertions(+), 20 deletions(-) drivers/kvm/kvm.h | 3 +++ drivers/kvm/kvm_main.c | 24 ++++-------------------- drivers/kvm/x86.c | 36 ++++++++++++++++++++++++++++++++++++
Create kvm_arch_vcpu_create(), moving more x86 code out of kvm_main.c. Old code flow (from patch 1): kvm_vm_ioctl_create_vcpu() kvm_x86_ops->vcpu_create() kvm_x86_vcpu_init() kvm_vcpu_init() New code flow: kvm_vm_ioctl_create_vcpu() kvm_arch_vcpu_create() kvm_x86_ops->vcpu_create() kvm_x86_vcpu_init() kvm_vcpu_init() Only build-tested, and the error-handling paths are a little tricky! Comments? Signed-off-by: Hollis Blanchard <[EMAIL PROTECTED]> diff --git a/drivers/kvm/kvm.h b/drivers/kvm/kvm.h --- a/drivers/kvm/kvm.h +++ b/drivers/kvm/kvm.h @@ -490,6 +490,9 @@ int kvm_vcpu_init(struct kvm_vcpu *vcpu, int kvm_vcpu_init(struct kvm_vcpu *vcpu, struct kvm *kvm, unsigned id); void kvm_vcpu_uninit(struct kvm_vcpu *vcpu); +struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, int n); +void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu); + int kvm_x86_vcpu_init(struct kvm_vcpu *vcpu, struct kvm *kvm, unsigned id); void kvm_x86_vcpu_uninit(struct kvm_vcpu *vcpu); diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c --- a/drivers/kvm/kvm_main.c +++ b/drivers/kvm/kvm_main.c @@ -852,28 +852,17 @@ static int kvm_vm_ioctl_create_vcpu(stru if (!valid_vcpu(n)) return -EINVAL; - vcpu = kvm_x86_ops->vcpu_create(kvm, n); + vcpu = kvm_arch_vcpu_create(kvm, n); if (IS_ERR(vcpu)) return PTR_ERR(vcpu); preempt_notifier_init(&vcpu->preempt_notifier, &kvm_preempt_ops); - - /* We do fxsave: this must be aligned. */ - BUG_ON((unsigned long)&vcpu->host_fx_image & 0xF); - - vcpu_load(vcpu); - r = kvm_x86_ops->vcpu_reset(vcpu); - if (r == 0) - r = kvm_mmu_setup(vcpu); - vcpu_put(vcpu); - if (r < 0) - goto free_vcpu; mutex_lock(&kvm->lock); if (kvm->vcpus[n]) { r = -EEXIST; mutex_unlock(&kvm->lock); - goto mmu_unload; + goto destroy_vcpu; } kvm->vcpus[n] = vcpu; mutex_unlock(&kvm->lock); @@ -889,13 +878,8 @@ unlink: kvm->vcpus[n] = NULL; mutex_unlock(&kvm->lock); -mmu_unload: - vcpu_load(vcpu); - kvm_mmu_unload(vcpu); - vcpu_put(vcpu); - -free_vcpu: - kvm_x86_ops->vcpu_free(vcpu); +destroy_vcpu: + kvm_arch_vcpu_destroy(vcpu); return r; } diff --git a/drivers/kvm/x86.c b/drivers/kvm/x86.c --- a/drivers/kvm/x86.c +++ b/drivers/kvm/x86.c @@ -2377,3 +2377,39 @@ void kvm_x86_vcpu_uninit(struct kvm_vcpu free_page((unsigned long)vcpu->pio_data); } EXPORT_SYMBOL_GPL(kvm_x86_vcpu_uninit); + +struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, int n) +{ + struct kvm_vcpu *vcpu; + int r; + + vcpu = kvm_x86_ops->vcpu_create(kvm, n); + if (IS_ERR(vcpu)) + return vcpu; + + /* We do fxsave: this must be aligned. */ + BUG_ON((unsigned long)&vcpu->host_fx_image & 0xF); + + vcpu_load(vcpu); + r = kvm_x86_ops->vcpu_reset(vcpu); + if (r == 0) + r = kvm_mmu_setup(vcpu); + vcpu_put(vcpu); + if (r < 0) + goto free_vcpu; + + return vcpu; + +free_vcpu: + kvm_x86_ops->vcpu_free(vcpu); + return ERR_PTR(r); +} + +void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu) +{ + vcpu_load(vcpu); + kvm_mmu_unload(vcpu); + vcpu_put(vcpu); + + kvm_x86_ops->vcpu_free(vcpu); +} ------------------------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/ _______________________________________________ kvm-devel mailing list kvm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-devel