KVM: ia64: fix locking order entering guest
Reorder locking as down_read() may return with local interrupts enabled, which means we could go into vti_vcpu_run() with interrupts enabled. This caused random crashes on the Altix as the timer interrupt tried to read a memory mapped clock source, for which the TLB had not yet been reinstated in the exit, before ipsr was retored. Signed-off-by: Jes Sorensen <jes@sgi.com> Acked-by: Xiantao Zhang <xiantao.zhang@intel.com> Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
@@ -610,20 +610,22 @@ static int __vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
|
|||||||
int r;
|
int r;
|
||||||
|
|
||||||
again:
|
again:
|
||||||
preempt_disable();
|
|
||||||
local_irq_disable();
|
|
||||||
|
|
||||||
if (signal_pending(current)) {
|
if (signal_pending(current)) {
|
||||||
local_irq_enable();
|
|
||||||
preempt_enable();
|
|
||||||
r = -EINTR;
|
r = -EINTR;
|
||||||
kvm_run->exit_reason = KVM_EXIT_INTR;
|
kvm_run->exit_reason = KVM_EXIT_INTR;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* down_read() may sleep and return with interrupts enabled
|
||||||
|
*/
|
||||||
|
down_read(&vcpu->kvm->slots_lock);
|
||||||
|
|
||||||
|
preempt_disable();
|
||||||
|
local_irq_disable();
|
||||||
|
|
||||||
vcpu->guest_mode = 1;
|
vcpu->guest_mode = 1;
|
||||||
kvm_guest_enter();
|
kvm_guest_enter();
|
||||||
down_read(&vcpu->kvm->slots_lock);
|
|
||||||
r = vti_vcpu_run(vcpu, kvm_run);
|
r = vti_vcpu_run(vcpu, kvm_run);
|
||||||
if (r < 0) {
|
if (r < 0) {
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
|
Reference in New Issue
Block a user