diff options
Diffstat (limited to 'arch/ia64/kvm/kvm-ia64.c')
| -rw-r--r-- | arch/ia64/kvm/kvm-ia64.c | 15 | 
1 files changed, 6 insertions, 9 deletions
diff --git a/arch/ia64/kvm/kvm-ia64.c b/arch/ia64/kvm/kvm-ia64.c index d0ad538f008..d5e38464127 100644 --- a/arch/ia64/kvm/kvm-ia64.c +++ b/arch/ia64/kvm/kvm-ia64.c @@ -636,12 +636,9 @@ static void kvm_vcpu_post_transition(struct kvm_vcpu *vcpu)  static int __vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)  {  	union context *host_ctx, *guest_ctx; -	int r; +	int r, idx; -	/* -	 * down_read() may sleep and return with interrupts enabled -	 */ -	down_read(&vcpu->kvm->slots_lock); +	idx = srcu_read_lock(&vcpu->kvm->srcu);  again:  	if (signal_pending(current)) { @@ -663,7 +660,7 @@ again:  	if (r < 0)  		goto vcpu_run_fail; -	up_read(&vcpu->kvm->slots_lock); +	srcu_read_unlock(&vcpu->kvm->srcu, idx);  	kvm_guest_enter();  	/* @@ -687,7 +684,7 @@ again:  	kvm_guest_exit();  	preempt_enable(); -	down_read(&vcpu->kvm->slots_lock); +	idx = srcu_read_lock(&vcpu->kvm->srcu);  	r = kvm_handle_exit(kvm_run, vcpu); @@ -697,10 +694,10 @@ again:  	}  out: -	up_read(&vcpu->kvm->slots_lock); +	srcu_read_unlock(&vcpu->kvm->srcu, idx);  	if (r > 0) {  		kvm_resched(vcpu); -		down_read(&vcpu->kvm->slots_lock); +		idx = srcu_read_lock(&vcpu->kvm->srcu);  		goto again;  	}  |