diff options
Diffstat (limited to 'virt/kvm/kvm_main.c')
| -rw-r--r-- | virt/kvm/kvm_main.c | 13 | 
1 files changed, 10 insertions, 3 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 64ec2222a196..a49df8988cd6 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -3328,9 +3328,11 @@ bool kvm_vcpu_block(struct kvm_vcpu *vcpu)  	vcpu->stat.generic.blocking = 1; +	preempt_disable();  	kvm_arch_vcpu_blocking(vcpu); -  	prepare_to_rcuwait(wait); +	preempt_enable(); +  	for (;;) {  		set_current_state(TASK_INTERRUPTIBLE); @@ -3340,9 +3342,11 @@ bool kvm_vcpu_block(struct kvm_vcpu *vcpu)  		waited = true;  		schedule();  	} -	finish_rcuwait(wait); +	preempt_disable(); +	finish_rcuwait(wait);  	kvm_arch_vcpu_unblocking(vcpu); +	preempt_enable();  	vcpu->stat.generic.blocking = 0; @@ -4300,8 +4304,11 @@ static int kvm_ioctl_create_device(struct kvm *kvm,  		kvm_put_kvm_no_destroy(kvm);  		mutex_lock(&kvm->lock);  		list_del(&dev->vm_node); +		if (ops->release) +			ops->release(dev);  		mutex_unlock(&kvm->lock); -		ops->destroy(dev); +		if (ops->destroy) +			ops->destroy(dev);  		return ret;  	}  | 
