diff options
Diffstat (limited to 'arch/powerpc/kvm/powerpc.c')
| -rw-r--r-- | arch/powerpc/kvm/powerpc.c | 88 | 
1 files changed, 44 insertions, 44 deletions
diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c index 416fb3d2a1d0..1af96fb5dc6f 100644 --- a/arch/powerpc/kvm/powerpc.c +++ b/arch/powerpc/kvm/powerpc.c @@ -475,7 +475,7 @@ void kvm_arch_destroy_vm(struct kvm *kvm)  #endif  	kvm_for_each_vcpu(i, vcpu, kvm) -		kvm_arch_vcpu_free(vcpu); +		kvm_vcpu_destroy(vcpu);  	mutex_lock(&kvm->lock);  	for (i = 0; i < atomic_read(&kvm->online_vcpus); i++) @@ -720,22 +720,55 @@ void kvm_arch_flush_shadow_memslot(struct kvm *kvm,  	kvmppc_core_flush_memslot(kvm, slot);  } -struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, unsigned int id) +int kvm_arch_vcpu_precreate(struct kvm *kvm, unsigned int id) +{ +	return 0; +} + +static enum hrtimer_restart kvmppc_decrementer_wakeup(struct hrtimer *timer)  {  	struct kvm_vcpu *vcpu; -	vcpu = kvmppc_core_vcpu_create(kvm, id); -	if (!IS_ERR(vcpu)) { -		vcpu->arch.wqp = &vcpu->wq; -		kvmppc_create_vcpu_debugfs(vcpu, id); -	} -	return vcpu; + +	vcpu = container_of(timer, struct kvm_vcpu, arch.dec_timer); +	kvmppc_decrementer_func(vcpu); + +	return HRTIMER_NORESTART; +} + +int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu) +{ +	int err; + +	hrtimer_init(&vcpu->arch.dec_timer, CLOCK_REALTIME, HRTIMER_MODE_ABS); +	vcpu->arch.dec_timer.function = kvmppc_decrementer_wakeup; +	vcpu->arch.dec_expires = get_tb(); + +#ifdef CONFIG_KVM_EXIT_TIMING +	mutex_init(&vcpu->arch.exit_timing_lock); +#endif +	err = kvmppc_subarch_vcpu_init(vcpu); +	if (err) +		return err; + +	err = kvmppc_core_vcpu_create(vcpu); +	if (err) +		goto out_vcpu_uninit; + +	vcpu->arch.wqp = &vcpu->wq; +	kvmppc_create_vcpu_debugfs(vcpu, vcpu->vcpu_id); +	return 0; + +out_vcpu_uninit: +	kvmppc_mmu_destroy(vcpu); +	kvmppc_subarch_vcpu_uninit(vcpu); +	return err;  }  void kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu)  {  } -void kvm_arch_vcpu_free(struct kvm_vcpu *vcpu) +void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)  {  	/* Make sure we're not using the vcpu anymore */  	hrtimer_cancel(&vcpu->arch.dec_timer); @@ -758,11 +791,9 @@ void kvm_arch_vcpu_free(struct kvm_vcpu *vcpu)  	}  	kvmppc_core_vcpu_free(vcpu); -} -void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu) -{ -	kvm_arch_vcpu_free(vcpu); +	kvmppc_mmu_destroy(vcpu); +	kvmppc_subarch_vcpu_uninit(vcpu);  }  int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu) @@ -770,37 +801,6 @@ int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu)  	return kvmppc_core_pending_dec(vcpu);  } -static enum hrtimer_restart kvmppc_decrementer_wakeup(struct hrtimer *timer) -{ -	struct kvm_vcpu *vcpu; - -	vcpu = container_of(timer, struct kvm_vcpu, arch.dec_timer); -	kvmppc_decrementer_func(vcpu); - -	return HRTIMER_NORESTART; -} - -int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu) -{ -	int ret; - -	hrtimer_init(&vcpu->arch.dec_timer, CLOCK_REALTIME, HRTIMER_MODE_ABS); -	vcpu->arch.dec_timer.function = kvmppc_decrementer_wakeup; -	vcpu->arch.dec_expires = get_tb(); - -#ifdef CONFIG_KVM_EXIT_TIMING -	mutex_init(&vcpu->arch.exit_timing_lock); -#endif -	ret = kvmppc_subarch_vcpu_init(vcpu); -	return ret; -} - -void kvm_arch_vcpu_uninit(struct kvm_vcpu *vcpu) -{ -	kvmppc_mmu_destroy(vcpu); -	kvmppc_subarch_vcpu_uninit(vcpu); -} -  void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)  {  #ifdef CONFIG_BOOKE  |